2012-03-22 8 views
67

क्यों एक अज्ञात फ़ंक्शन में सख्त मोड में जावास्क्रिप्ट का उपयोग करते समय अपरिभाषित है? मैं समझता हूं कि यह क्यों समझ सकता है, लेकिन मुझे कोई ठोस जवाब नहीं मिला।सख्त उपयोग करते समय अज्ञात फ़ंक्शन में "यह" क्यों अनिश्चित है?

उदाहरण: एक बेला में

(function() { 
    "use strict"; 

    this.foo = "bar"; // *this* is undefined, why? 
}()); 

टेस्ट: http://jsfiddle.net/Pyr5g/1/ चेक बाहर लकड़हारा (फ़ायरबग)।

+3

ध्यान दें कि इसका अज्ञात कार्यों, लेकिन आमंत्रण विधि से कोई लेना देना नहीं है। देखें [यह संशोधित पहेली] (http://jsfiddle.net/Pyr5g/3/) (कंसोल लॉग में देखें)। – Phrogz

+0

@Phrogz: यह हो सकता है कि कुछ भ्रम से आया था। यह बात बताने के लिए धन्यवाद। –

उत्तर

79

ऐसा इसलिए है क्योंकि, ईसीएमएस्क्रिप्ट 262 संस्करण 5 तक, अगर constructor pattern का उपयोग करने वाले लोग new कीवर्ड का उपयोग करना भूल गए तो एक बड़ा भ्रम था। यदि आप ईएस 3 में कन्स्ट्रक्टर फ़ंक्शन को कॉल करते समय new का उपयोग करना भूल गए हैं, this वैश्विक ऑब्जेक्ट (window ब्राउज़र में संदर्भित) का संदर्भ देता है और आप वैरिएबल के साथ वैश्विक ऑब्जेक्ट को घुमाएंगे।

यह भयानक व्यवहार था और इसलिए ईसीएमए के लोगों ने निर्णय लिया, बस thisundefined पर सेट करने के लिए।

उदाहरण:

function myConstructor() { 
    this.a = 'foo'; 
    this.b = 'bar'; 
} 

myInstance  = new myConstructor(); // all cool, all fine. a and b were created in a new local object 
myBadInstance = myConstructor(); // oh my gosh, we just created a, and b on the window object 

अंतिम पंक्ति सख्त ES5 में एक त्रुटि फेंक

"TypeError: this is undefined" 

+4

यह समझ में आता है। क्या आपके पास बयान का बैक अप लेने का संदर्भ है? –

+1

@RobW: मुझे खुद को खोजना होगा, लेकिन मैंने डगलस क्रॉकफोर्ड को कई बार सुना जहां उन्होंने कहा, यह निर्णय का कारण था। – jAndy

+1

जावास्क्रिप्ट में इसका उल्लेख है: क्रॉकफोर्ड द्वारा गुड पार्ट्स। यह विस्तार से वर्णित है। हालांकि, ईसीएमए के फैसले के बारे में नहीं। – madr

12

एक तंत्र "बॉक्सिंग" कहा जाता है (जो एक बहुत अच्छा व्यवहार है) जो कॉल किए गए फ़ंक्शन के संदर्भ में प्रवेश करने से पहले this ऑब्जेक्ट को लपेटता या बदलता है। आपके मामले में, this का मान undefined होना चाहिए क्योंकि आप किसी ऑब्जेक्ट की विधि के रूप में फ़ंक्शन को कॉल नहीं कर रहे हैं। यदि गैर सख्त मोड, इस मामले में, इसे window ऑब्जेक्ट द्वारा प्रतिस्थापित किया गया है। strict मोड में यह हमेशा अपरिवर्तित होता है, यही कारण है कि यह undefined है।

आप
https://developer.mozilla.org/en/JavaScript/Strict_mode

+0

धन्यवाद। दुर्भाग्य से मैं दो उत्तरों को सही के रूप में चिह्नित नहीं कर सकता। –

+0

@ सैम्युएल तो हम सख्त मोड में विंडो ऑब्जेक्ट में चर को कैसे आवंटित कर सकते हैं ?? –

5

में और अधिक जानकारी प्राप्त कर सकते This Stack Overflow answer के अनुसार, आप, अनाम प्रक्रियाएं अंदर this उपयोग कर सकते हैं बस इसे के अंत में .call(this) फोन करके।

(function() { 
    "use strict"; 

    this.foo = "bar"; 
}).call(this); 
+0

ध्यान दें कि इस मामले में 'यह' विंडो 'ऑब्जेक्ट होगा, जो वांछित नहीं हो सकता है – Ninjakannon

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

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