2011-12-24 16 views
5

ब्राउज़र्स और नोड के बीच क्या अंतर है?ब्राउज़र और नोड के बीच क्या अंतर है?

नोड पर setName.js:

var setName; 
setName = function (name) { 
    return this.name = name; 
}; 
setName("LuLu"); 
//LuLu 
console.log(name); 
//undefined 
console.log(this.name); 

ब्राउज़र में setName.html: उदाहरण के लिए

<script> 
    var setName; 
    setName = function (name) { 
     return this.name = name; 
    }; 
    setName("LuLu"); 
    //LuLu 
    console.log(name); 
    //LuLu 
    console.log(this.name); 
</script> 

दूसरा लॉग अलग है, क्यों?

+0

यह वास्तव में "अनिर्धारित", मेरे नोड संस्करण 'v0.4.10' – island205

+3

है (1) हम ब्राउज़र में वैश्विक चर से बचने की कोशिश। (2) आप सख्त मोड कोड है, जो मामले में ऊपर कोड फेंकता है ... –

उत्तर

7

नोड एक JavaScript इंजन, नहीं एक ब्राउज़र है। विशेष कारण है कि आप नोड में undefined, और Lulu एक ब्राउज़र में देखते हैं? Differences in the global namespace:

ब्राउज़र में, शीर्ष-स्तरीय दायरा वैश्विक दायरा है। इसका मतलब है कि यदि आप वैश्विक दायरे में हैं तो ब्राउज़र में var something वैश्विक चर परिभाषित करेगा। नोड में यह अलग है। शीर्ष-स्तरीय दायरा वैश्विक दायरा नहीं है; एक नोड मॉड्यूल के अंदर var something उस मॉड्यूल के लिए स्थानीय होगा।

ब्राउज़र में, thiswindow वस्तु के लिए एक संदर्भ है - ब्राउज़र की ग्लोबल नेम स्पेस - सभी कार्य करता है जो एक वस्तु (जैसे नहींfoo.bar() की तरह) के लिए स्वाधीन लागू कर रहे हैं के लिए। नोड में, this वैश्विक नामस्थान का संदर्भ नहीं है।


एनबी।console.log(this.name) एक नोड दुभाषिया में Lulu, नहीं undefined प्रिंट होगा। यही कारण है, क्योंकि केवल आरईपीएल में,

> this === global 
true 

आगे पढ़ने @How To Node: What is "this?"


ठीक है, एक संपादित @Šime Vidas' के बारे में टिप्पणी से प्रेरित के रूप में है thisES5 strict mode में:

    01,235,
  • वैश्विक संदर्भ में (किसी भी फ़ंक्शन के बाहर), this वैश्विक वस्तु को संदर्भित करता है, चाहे सख्त मोड में हो या नहीं।
  • this कीवर्ड एक समारोह के अंदर होता है, अपने मूल्य how the function is called पर निर्भर करता है।
  • जब किसी फ़ंक्शन को ऑब्जेक्ट की विधि के रूप में बुलाया जाता है, तो इसकी this उस ऑब्जेक्ट पर सेट होती है जिस पर विधि को कॉल किया जाता है।

अधिक दिलचस्प पढ़ने one of his blog posts में Juriy Zaytsev (aka @kangax) के सौजन्य से।

+3

आपका जवाब सख्त मोड के बारे में जानकारी शामिल करके उन्हें अधिक भविष्य उन्मुख बनाने पर विचार लेखन शुरू करना चाहते हैं। (समारोह शरीर में, 'this' अपरिभाषित जब तक स्पष्ट मंगलाचरण विधि द्वारा निर्धारित है।) –

+0

तुम ठीक कह रहे हैं, लेकिन केवल आरईपीएल में! – island205

+0

@ ime यह कैसा है? –

2

आपका ब्राउज़र कोड window मेजबान वस्तु है। नोड में उस होस्ट ऑब्जेक्ट नहीं है।जब आप this.name निर्धारित करते हैं, आप वास्तव में यह window ऑब्जेक्ट में एक वैश्विक चर बनाने उर्फ ​​सेट कर रहे हैं।

window.name === this.name // true

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