2012-10-27 23 views
5

मैं JavaScrit: द गुड पार्ट्स से मॉड्यूल उदाहरण का परीक्षण कर रहा हूं। मैं नहीं जानता कि फ़ंक्शन में ए और बी में कौन गुजरता है (ए, बी)। किसी भी तरह यह काम करता है।फ़ंक्शन के मूल्य क्या हैं (ए, बी)?

Function.prototype.method = function(name, f) { 
    this.prototype[name] = f; 
    return this; 
} 
String.method('de', function() { 
    var entity = { 
     lt : '<', 
     gt : '>' 
    }; 
    return function() { 
     return this.replace(/&([^&;]+);/g, function(a, b) { 
      document.write("<br> a=" + a + " b=" + b); 
      var r = entity[b]; 
      return typeof r === 'string' ? r : a; 
     }); 
    }; 
}()); 
document.write("<br>" + '&lt;&gt'.de()); 
+4

['स्ट्रिंग.रेप्लेस 'के लिए प्रलेखन] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter) इसका उत्तर देना चाहिए। – DCoder

+0

ये लेफ्टिनेंट और gt हैं? – Darek

+0

यह समझने में आसान है कि क्या होता है यदि आप स्व-निष्पादन कार्य को तेजी से खोजते हैं, अन्यथा आपको यह सोचने में कई मिनट लगेंगे कि क्यों 'String.de' वापस किए गए फ़ंक्शन के कोड को मुद्रित नहीं करेगा। – clentfort

उत्तर

1

यह समझने के लिए कि क्या हो रहा है, वास्तव में क्या किया जाता है पर बहुत नजदीक दिखना है।

Function.prototype.method = function(name, f) { 
    this.prototype[name] = f; 
    return this; 
} 

यह हिस्सा बहुत स्पष्ट है, यह किसी भी वस्तु के प्रोटोटाइप को बढ़ाने के लिए "शॉर्टकट" है।

जादू आपके कोड के दूसरे भाग में होता है, पहले परिभाषित फ़ंक्शन को दूसरे पैरामीटर के रूप में एक स्व-निष्पादन फ़ंक्शन के साथ प्रदान किया जाता है!

String.method('de', function() { 
    var entity = { 
     lt : '<', 
     gt : '>' 
    }; 
    return function() { 
     return this.replace(/&([^&;]+);/g, function(a, b) { 
      // "this" will refer to the object the function is bound to. 
      document.write("<br> a=" + a + " b=" + b); 
      var r = entity[b]; 
      return typeof r === 'string' ? r : a; 
     }); 
    }; 
}()); <-- The magic happens here! 

इसका मतलब यह है, जावास्क्रिप्ट दुभाषिया "पहली भीतरी" समारोह के रिटर्न मान (एक सीधे String.method को आपूर्ति) वास्तविक समारोह के रूप में, "पहले भीतरी" समारोह के बाद से उपयोग करेगा यह सौंपने से पहले मार डाला जाता है String.prototype पर।

नीचे दिया गया कोड वही करता है लेकिन स्थानीय दायरे में एक और चर (de) डालता है। उपर्युक्त दृष्टिकोण दायरे को प्रदूषित नहीं करता है, यह इसे प्राप्त करने का एक और शानदार तरीका है। आप स्थानीय दायरे में entity डालकर इसे और भी खोल सकते हैं।

var de = function() { 
    var entity = { 
     lt : '<', 
     gt : '>' 
    }; 
    return function() { 
     return this.replace(/&([^&;]+);/g, function(a, b) { 
      // "this" will refer to the object the function is bound to. 
      document.write("<br> a=" + a + " b=" + b); 
      var r = entity[b]; 
      return typeof r === 'string' ? r : a; 
     }); 
    }; 
}; 
String.method('de', de()); 

अब अपने प्रश्न का संबंध कैसे a और b भूमिका निभाते हैं! यह इस बात से संबंधित है कि String.replace व्यवहार करता है जब दूसरा पैरामीटर पारित होता है। टिप्पणियों में प्रदान किए गए link डीकोडर ने यह बहुत अच्छा बताया है! पैरामीटर a संपूर्ण मिलान वाली सबस्ट्रिंग है, b पहला मिलान "ब्रांडेडइज्ड सबमिच" है।

+0

हां, यह एक उत्कृष्ट उत्तर है। आपका बहुत बहुत धन्यवाद! –

+0

@JAny धन्यवाद, क्या आप इसे उत्तर के रूप में स्वीकार करेंगे? (ऐसा करने के उत्तर के स्कोर के नीचे हरे रंग की चेकमार्क पर क्लिक करें।) यह भी एक अच्छा सवाल है, मुझे यह पता लगाने में कुछ समय लगा कि क्या हो रहा था। – clentfort

संबंधित मुद्दे