2012-12-15 20 views
5

के बीच मैं यानी में कोड निम्नलिखित की कोशिश की है, फ़ायरफ़ॉक्स और Node.jsअलग व्यवहार "इस" Node.js और ब्राउज़रों

var x = 10; 
var o = { x: 15 }; 
function f(){ 
    console.log(this.x); 
} 
f(); 
f.call(o); 

ब्राउज़रों में परिणाम 10, 15, लेकिन में परिणाम हैं node.js अपरिभाषित है, 15.

कृपया मुझे बताएं कि ब्राउज़र में "यह" कीवर्ड और node.js का अलग-अलग व्यवहार क्या है? मैंने कई पेज पढ़े हैं लेकिन कोई स्पष्ट जवाब नहीं था। अग्रिम धन्यवाद।

+0

शायद नोड.जेएस डिफ़ॉल्ट रूप से सख्त मोड में चलता है ... (सख्त मोड में, 'यह', एक फ़ंक्शन के अंदर, कभी भी वैश्विक ऑब्जेक्ट पर नहीं आता है।) –

+2

आप इस कोड को node.js में कैसे लोड कर रहे हैं? यदि आप जो भी लोड करते हैं, तो आपको यह व्यवहार दिखाई देगा यदि node.js कोड ने इसे फ़ंक्शन बॉडी के रूप में 'नया फ़ंक्शन (जावास्क्रिप्टसोर्सकोड)()' के माध्यम से पार्स किया है, क्योंकि तब 'var x' शीर्ष स्तर के बजाय फ़ंक्शन में एक परिवर्तनीय स्थानीय घोषित करेगा वैश्विक। –

+2

@ ŠimeVidas, उस स्थिति में आपको 'this.x' के लिए 'अपरिभाषित' अपवाद, 'शून्य' अपवाद नहीं मिलेगा। –

उत्तर

6

नोडज में लोड जावास्क्रिप्ट फ़ाइलों को स्वचालित रूप से अज्ञात कार्यों में लपेटा जाता है।

तो नोड में आप वास्तव में क्या चल रहा है कर रहे हैं:

(function(/* There are args here, but they aren't important for this answer */){ 
    var x = 10; 
    var o = { x: 15 }; 
    function f(){ 
    console.log(this.x); 
    } 
    f(); 
    f.call(o); 
})(); 

ब्राउज़र ऐसा नहीं करती है। मुद्दा यह है कि अब नोड x में फ़ंक्शन के दायरे में केवल एक सामान्य चर है, यह वैश्विक दायरे का हिस्सा नहीं है। जब आप f() पर कॉल करते हैं, तो f के भीतर वैश्विक दायरा है।

यदि वैश्विक दायरे पर सीधे x डाल दिया गया है, तो यह दोनों मामलों में काम करेगा।

this.x = 10; 
नोड में global वैश्विक वस्तु

कि ब्राउज़र में window वैश्विक वस्तु पर x स्थापित करेंगे, और।

आम तौर पर, आप नोड में वैश्विक स्तर पर चीजें लोड नहीं करते हैं, इसके बजाय आप described here के रूप में अपने कोड को मॉड्यूल में समूहित करते हैं। here तक पहुंचने वाली विभिन्न वैश्विक चीज़ों के बारे में जानकारी है। और यदि आप रैपर के बारे में उत्सुक हैं, तो आप इसे here देख सकते हैं।

+0

बहुत बहुत धन्यवाद। क्या आप कृपया मुझे इसके बारे में कोई nodejs दस्तावेज दे सकते हैं? –

+1

@CongNguyen अंत में थोड़ा सा जोड़ा गया। – loganfsmyth

2

f() में नियमित फ़ंक्शन को कॉल करते समय, व्यवहार सख्त मोड बनाम नियमित मोड में भिन्न होता है। नियमित मोड में, this वैश्विक वस्तु होगी (उदा। window)। सख्त मोड में, thisundefined होगा।

कि अंतर के अलावा, एक समारोह कॉल में this का काम पूरी तरह से जावास्क्रिप्ट मानक में निर्दिष्ट किया जाता, इसलिए यदि आप विभिन्न स्थितियों में मतभेद को देख रहे हैं, तो यह शायद strict मोड की वजह से है। दोनों वातावरण में strict मोड जोड़ें और आपको लगातार व्यवहार देखना चाहिए।

अधिक जानकारी के लिए आप इस MDN reference पर "जावास्क्रिप्ट सुरक्षित" अनुभाग पढ़ सकते हैं।

+0

नहीं, सख्त मोड ओपीएस मुद्दे से संबंधित नहीं है। यदि 'यह' अनिर्धारित 'था, तो फ़ंक्शन फेंक देगा, लेकिन यह' अपरिभाषित 'लॉग करता है (इसलिए यह दोनों स्थितियों में वैश्विक वस्तु है)। –