ECMA 5 के संदर्भ को स्पष्ट करने की आवश्यकता है।
मेरा मानना है कि इसका अर्थ है ECMA-262 संस्करण 5. यह ध्यान दिया जाना चाहिए कि ECMA-262 (उर्फ ECMAScript या, कम सटीक, जावास्क्रिप्ट) एक सामान्य स्क्रिप्टिंग भाषा है जिसे इंटरनेट ब्राउज़रों में लागू किया गया है । संस्करण 5.1 मानक से:
फ़ंक्शन ऑब्जेक्ट F में समाहित फ़ंक्शन कोड के लिए नियंत्रण के संदर्भ में निष्पादन के चरण में प्रवेश करते समय निम्न चरणों का पालन किया जाता है, एक कॉलर ने यह प्रदान किया है, और एक कॉल करने वाले ने तर्क दिया:
- यदि फ़ंक्शन कोड सख्त कोड है, तो ThisBinding को thisArg पर सेट करें।
- यदि यह आधार शून्य या अपरिभाषित है, तो इस ऑब्जेक्ट को वैश्विक ऑब्जेक्ट पर सेट करें।
- यदि टाइप (thisArg) ऑब्जेक्ट नहीं है, तो इसे ToBbject (ThisArg) पर सेट करें।
- Els ने TheBinding को thisArg पर सेट किया
- ... ("इस" के बारे में नहीं)
"ग्लोबल ऑब्जेक्ट" शब्द, जो भी वस्तु है वह स्कोप श्रृंखला के शीर्ष पर है। ब्राउज़रों के लिए यह "विंडो" ऑब्जेक्ट होगा लेकिन यह एक कार्यान्वयन विकल्प है (विंडोज स्क्रिप्ट होस्ट में एक अदृश्य वैश्विक ऑब्जेक्ट है लेकिन कोई भी सख्त मोड नहीं है ताकि अयोग्य संदर्भ इसके गुणों तक पहुंच सकें और कोई वैश्विक "स्व" नहीं है)। इसके अलावा, "सख्त मोड" को स्पष्ट रूप से सक्षम होना चाहिए अन्यथा यह सक्रिय नहीं है (मानक का खंड 14.1)। इस प्रकार, एक अपरिभाषित "यह" अभी भी "ईसीएमए 5" में वैश्विक वस्तु (खिड़की) को हल करेगा, जिसमें सख्त मोड सक्रिय नहीं है।
तो सवाल का जवाब है:
"यह" हमेशा फ़ंक्शन को लागू करने वाली वस्तु को संदर्भित करता है। यदि फ़ंक्शन किसी ऑब्जेक्ट (यानी नहीं एक विधि कॉल) द्वारा आह्वान नहीं किया गया था, तो "यह" (फ़ंक्शन को पारित किया गया) "अपरिभाषित" है। हालांकि, यदि सख्त मोड का उपयोग नहीं किया जाता है, तो एक अपरिभाषित "यह" वैश्विक ऑब्जेक्ट (नियम 2 ऊपर) पर सेट है।
"स्व" का कोई विशेष वाक्यगत अर्थ नहीं है, यह सिर्फ एक पहचानकर्ता है। ब्राउज़र्स विंडो को परिभाषित करते हैं। स्वयं (वैश्विक विंडो ऑब्जेक्ट की एक संपत्ति) = विंडो। यह "स्व" के अयोग्य सन्दर्भों के परिणामस्वरूप "विंडो" के समान होता है "स्वयं" को "एनक्लोजिंग स्कोप" के रूप में फिर से परिभाषित किया गया है (जैसे कि "var self = this?" ऊपर "। सौभाग्य" "इसे" पुन: परिभाषित करना)।
तो ऊपर दिए गए उदाहरण का पूरा विवरण है:
outer func: this.foo = bar
// "this" refers to the invoking object "myObject"
outer func: self.foo = bar
// "self" resolves to the variable in the local scope which has been set to "this" so it is also "myObject"
inner func: this.foo = undefined
// "this" refers to the invoking object (none) and so is replaced by the global object (strict mode must be off). "window" has no foo property so its "value" is undefined.
inner func: self.foo = bar
// self resolves to the variable in the enclosing scope which is still "myObject"
उदाहरण की एक दिलचस्प भिन्नता आंतरिक फ़ंक्शन के संदर्भ को वापस करके एक बंद बनाता है।
var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo);
return function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
};
}
};
var yourObject = {
foo: "blat",
func: myObject.func() // function call not function object
};
console.log("----");
yourObject.func();
उत्पादन
outer func: this.foo = bar
outer func: self.foo = bar
----
inner func: this.foo = blat
inner func: self.foo = bar
ध्यान दें कि कैसे आंतरिक फ़ंक्शन को तब तक नहीं बुलाया जाता है जब तक कि आपके ऑबजेक्ट द्वारा आमंत्रित नहीं किया जाता है। तो यह अब है। अब आपका ओओओजेक्ट है। यदि आप अभी भी एनक्लोजिंग स्कोप में वैरिएबल को हल करते हैं, जिस समय इनर फंक्शन ऑब्जेक्ट वापस आ गया था, (और परिणामस्वरूप क्लोजर अभी भी है) मायऑबजेक्ट। तो, आंतरिक फ़ंक्शन के भीतर, "यह" आंतरिक फ़ंक्शन को कॉल करने वाली वस्तु को संदर्भित करता है, जबकि "स्वयं" उस ऑब्जेक्ट को संदर्भित करता है, जो आंतरिक फ़ंक्शन के संदर्भ को बनाने के लिए बाहरी फ़ंक्शन को कहते हैं।
सारांश के सारांश को सारांशित करने के लिए, "यह" भाषा मानक द्वारा परिभाषित किया गया है, "स्व" को परिभाषित किया गया है जो कोई भी इसे परिभाषित करता है (रनटाइम कार्यान्वयनकर्ता या अंत प्रोग्रामर)।