इस तरह काम करता है क्योंकि प्रत्येक फ़ंक्शन ने अपने निष्पादन संदर्भ से जुड़ा हुआ है।
समारोह आह्वान करने के लिए call
या apply
का उपयोग करना::
लेकिन वहाँ यह करने के लिए अन्य तरीकों से, उदाहरण के लिए कर रहे हैं
function Alpha() {
this.onion = 'onion';
function Beta() {
alert(this.onion);
}
Beta.call(this);
}
var alpha1 = new Alpha();
// Alerts 'onion'
नए ECMAScript 5 वें संस्करण स्टैंडर्ड, समारोह लागू करने के लिए एक तरह से परिचय संदर्भ, Function.prototype.bind
विधि:
function Alpha() {
this.onion = 'onion';
var Beta = function() {
alert(this.onion);
}.bind(this);
Beta();
}
var alpha1 = new Alpha();
// Alerts 'onion'
हम कह सकते हैं कि Beta
फ़ंक्शन बाध्य है, और कोई फर्क नहीं पड़ता कि आप इसे कैसे कहते हैं, इसके this
मान बरकरार रहेगा।
यह विधि अभी तक व्यापक रूप से समर्थित नहीं है, वर्तमान में केवल IE9pre3 में यह शामिल है, लेकिन आप इसे अब बनाने के लिए an implementation शामिल कर सकते हैं।
अब मुझे के बारे में कैसे काम करता है this
विस्तृत करते हैं:
this
मूल्य प्रत्येक execution context पर मौजूद हैं, और के लिए फंक्शन कोड परोक्ष जब एक समारोह कॉल किया जाता है, मूल्य निर्धारित किया जाता है सेट कर दिया जाता निर्भर करता है कि संदर्भ अगर का गठन किया।
अपने उदाहरण में, जब आप Beta();
आह्वान है, क्योंकि यह किसी भी वस्तु के लिए बाध्य नहीं है, हम कह सकते हैं संदर्भ कोई आधार वस्तु, तो, this
मूल्य वैश्विक वस्तु के पास भेजेगा है।
अन्य मामले होता है जब आप उदाहरण के लिए एक समारोह है कि किसी वस्तु की संपत्ति के रूप में ही है आह्वान,:
var obj = {
foo: function() { return this === obj;}
};
obj.foo(); // true
आप देख सकते हैं, संदर्भ लागू किया जा रहा obj.bar();
एक आधार वस्तु है, जो obj
होता है , और this
आवंटित फ़ंक्शन के अंदर मूल्य इसका संदर्भ देगा।
नोट: reference type एक अमूर्त अवधारणा, भाषा कार्यान्वयन के उद्देश्य से आप कल्पना में विवरण देख सकते हैं के लिए परिभाषित किया गया है।
एक तिहाई मामले में जहां this
मूल्य परोक्ष सेट कर दिया जाता है जब आप new
ऑपरेटर का उपयोग, यह एक नव निर्मित वस्तु है कि इसके निर्माता के प्रोटोटाइप से विरासत का उल्लेख होगा:
function Foo() {
return this; // `this` is implicitly returned when a function is called
} // with `new`, this line is included only to make it obvious
var foo = new Foo();
foo instanceof Foo; // true
Foo.prototype.isPrototypeOf(foo); // true
+1। हमेशा के रूप में अच्छी तरह से। –
धन्यवाद @ टिम! – CMS