क्लोजर से एक उद्धरण का अनुसरण करता है : माइकल बोलिन द्वारा निश्चित गाइड । यह थोड़ा लंबा लग सकता है, लेकिन यह बहुत अंतर्दृष्टि के साथ संतृप्त है। "परिशिष्ट बी। अक्सर गलत समझा जावास्क्रिप्ट अवधारणाओं":
this
जब एक फ़ंक्शन को कॉल किया जाता है तो क्या होता है
प्रपत्र के किसी फ़ंक्शन को कॉल करते समय foo.bar.baz()
, ऑब्जेक्ट foo.bar
को रिसीवर के रूप में संदर्भित किया जाता है। जब फ़ंक्शन को कॉल किया जाता है, तो यह वह रिसीवर होता है जिसका उपयोग मूल्य के रूप में किया जाता है this
:
var obj = {};
obj.value = 10;
/** @param {...number} additionalValues */
obj.addValues = function(additionalValues) {
for (var i = 0; i < arguments.length; i++) {
this.value += arguments[i];
}
return this.value;
};
// Evaluates to 30 because obj is used as the value for 'this' when
// obj.addValues() is called, so obj.value becomes 10 + 20.
obj.addValues(20);
यदि किसी फ़ंक्शन को कॉल करने पर कोई स्पष्ट रिसीवर नहीं है, तो वैश्विक ऑब्जेक्ट रिसीवर बन जाता है। जैसा कि पृष्ठ ४ window में "goog.global" में बताया गया है, जब वेब ब्राउज़र में जावास्क्रिप्ट को निष्पादित किया जाता है, तो विंडो वैश्विक वस्तु है। यह कुछ आश्चर्यजनक व्यवहार की ओर जाता है:
var f = obj.addValues;
// Evaluates to NaN because window is used as the value for 'this' when
// f() is called. Because and window.value is undefined, adding a number to
// it results in NaN.
f(20);
// This also has the unintentional side effect of adding a value to window:
alert(window.value); // Alerts NaN
भले ही obj.addValues
और f
एक ही फ़ंक्शन को देखें, जब कॉल किया जाता है, तो वे अलग-अलग व्यवहार करते हैं क्योंकि प्रत्येक कॉल में रिसीवर का मूल्य अलग-अलग होता है। इस कारण से, जब किसी फ़ंक्शन को संदर्भित करता है this
, तो यह सुनिश्चित करना महत्वपूर्ण है कि this
इसे कहा जाने पर सही मूल्य होगा। स्पष्ट होने के लिए, यदि this
फ़ंक्शन बॉडी में संदर्भित नहीं किया गया था, तो व्यवहार f(20)
और obj.addValues(20)
समान होगा।
क्योंकि फ़ंक्शंस जावास्क्रिप्ट में प्रथम श्रेणी के ऑब्जेक्ट हैं, उनके पास अपने तरीके हो सकते हैं। सभी फ़ंक्शन के तरीके हैं call()
और apply()
जो फ़ंक्शन को this
कॉल करते समय रिसीवर (यानी, जिस ऑब्जेक्ट को संदर्भित करता है) को फिर से परिभाषित करना संभव बनाते हैं । विधि हस्ताक्षर निम्नानुसार हैं:
/**
* @param {*=} receiver to substitute for 'this'
* @param {...} parameters to use as arguments to the function
*/
Function.prototype.call;
/**
* @param {*=} receiver to substitute for 'this'
* @param {Array} parameters to use as arguments to the function
*/
Function.prototype.apply;
ध्यान दें कि केवल बीच का अंतर call()
और apply()
यह call()
फ़ंक्शन पैरामीटर को व्यक्तिगत तर्कों के apply()
रूप में प्राप्त करता है , जबकि उन्हें एकल सरणी के रूप में प्राप्त होता है:
// When f is called with obj as its receiver, it behaves the same as calling
// obj.addValues(). Both of the following increase obj.value by 60:
f.call(obj, 10, 20, 30);
f.apply(obj, [10, 20, 30]);
निम्न कॉल समतुल्य हैं, जैसे f
और obj.addValues
समान फ़ंक्शन को देखें:
obj.addValues.call(obj, 10, 20, 30);
obj.addValues.apply(obj, [10, 20, 30]);
हालांकि, न तो call()
apply()
अनिर्दिष्ट होने पर, रिसीवर तर्क के विकल्प के लिए अपने स्वयं के रिसीवर के मूल्य का न तो उपयोग करता है और ही , निम्नलिखित काम नहीं करेगा:
// Both statements evaluate to NaN
obj.addValues.call(undefined, 10, 20, 30);
obj.addValues.apply(undefined, [10, 20, 30]);
किसी फ़ंक्शन को कॉल करने पर मान this
कभी भी null
या नहीं हो सकता undefined
है। कबnull
या undefined
करने के लिए रिसीवर के रूप में आपूर्ति की है call()
या apply()
वैश्विक वस्तु बजाय रिसीवर के लिए मूल्य के रूप में प्रयोग किया जाता है। इसलिए, पिछले कोड में value
वैश्विक वस्तु नाम की संपत्ति को जोड़ने का एक ही अवांछनीय दुष्प्रभाव है ।
किसी फ़ंक्शन के बारे में सोचना उपयोगी हो सकता है क्योंकि उस चर का कोई ज्ञान नहीं है जिसे उसे सौंपा गया है। यह इस विचार को सुदृढ़ करने में मदद करता है कि इस का मान तब होगा जब फ़ंक्शन को परिभाषित करने के बजाए कॉल किया जाता है।
अर्क का अंत।
a
आर्ग्स के एरे के लिए आवेदन करने के लिए और आर्गc
के कॉलम के लिए कॉल करने के बारे में सोचें ।