नोडज में लोड जावास्क्रिप्ट फ़ाइलों को स्वचालित रूप से अज्ञात कार्यों में लपेटा जाता है।
तो नोड में आप वास्तव में क्या चल रहा है कर रहे हैं:
(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 देख सकते हैं।
शायद नोड.जेएस डिफ़ॉल्ट रूप से सख्त मोड में चलता है ... (सख्त मोड में, 'यह', एक फ़ंक्शन के अंदर, कभी भी वैश्विक ऑब्जेक्ट पर नहीं आता है।) –
आप इस कोड को node.js में कैसे लोड कर रहे हैं? यदि आप जो भी लोड करते हैं, तो आपको यह व्यवहार दिखाई देगा यदि node.js कोड ने इसे फ़ंक्शन बॉडी के रूप में 'नया फ़ंक्शन (जावास्क्रिप्टसोर्सकोड)()' के माध्यम से पार्स किया है, क्योंकि तब 'var x' शीर्ष स्तर के बजाय फ़ंक्शन में एक परिवर्तनीय स्थानीय घोषित करेगा वैश्विक। –
@ ŠimeVidas, उस स्थिति में आपको 'this.x' के लिए 'अपरिभाषित' अपवाद, 'शून्य' अपवाद नहीं मिलेगा। –