2013-04-25 13 views
5
var foo = '1', 
    bar = '2'; 

console.log(foo, bar, window.foo); //1, 2, undefined 

(function(foo){ 
    console.log(foo, bar); //2, 2 
})(bar); 

मैं ऊपर कोड के बारे में दो तुच्छ प्रश्न हैं:समारोह स्कोप और वैश्विक चर

  1. क्यों window.foo अपरिभाषित है? डिफ़ॉल्ट रूप से विंडो ऑब्जेक्ट से जुड़े सभी वैश्विक चर नहीं हैं?

  2. foo === 2 बंद होने के अंदर क्यों है? मुझे पता है कि मैं मूल bar को उपनाम foo के साथ पास कर रहा हूं, जो 2 है, लेकिन फ़ंक्शन स्कोप के बाहर foo अभी भी 1 है। और जहां तक ​​मुझे पता है, मूल foo को बंद करने के अंदर से भी पहुंचा जा सकता है। आईआईएफई के तर्क के रूप में पारित होने के बाद से "नया फू" प्राथमिकता दी गई है?

http://jsfiddle.net/GbeDX/

+1

प्रश्न 1 - देखें कि पहेली कैसे चलती है - 'ऑनलोड'। प्रश्न 2 - आप सही हैं। 'Foo' पैरामीटर बाहरी दायरे के 'foo'" को ओवरराइट करता है लेकिन ** केवल ** IIFE के अंदर। मुझे लगता है कि इसे छाया कहा जाता है। तो अब आप बाह्य 'foo' का संदर्भ नहीं दे पाएंगे जबतक कि आप पैरामीटर नाम नहीं बदलते ... या यदि 'foo' वास्तव में' विंडो' – Ian

उत्तर

9

क्यों window.foo अपरिभाषित है? विंडो ऑब्जेक्ट से स्वचालित रूप से जुड़े सभी "ग्लोबल" वेरिएबल नहीं हैं?

हां, वैश्विक चर window के गुण बन गए हैं, लेकिन कोड आपके पहेली में वैश्विक दायरे में नहीं चल रहा है। यह load इवेंट हैंडलर में चलाया जाता है (बाईं तरफ दूसरा चेकबॉक्स देखें, यह "ऑनलोड" कहता है)। यहां यह वैश्विक दायरे में चलाया गया है: http://jsfiddle.net/GbeDX/1/

foo === 2 बंद होने के अंदर क्यों है? [...] और जहां तक ​​मुझे पता है, मूल foo को बंद करने के अंदर से भी पहुंचा जा सकता है।

नहीं, यह नहीं हो सकता है। पैरामीटरfooछाया परिवर्तनीय foo। यदि यह वैश्विक चर है, तो आप इसे window.foo से एक्सेस कर सकते हैं।

+0

की संपत्ति के रूप में सेट किया गया है, तो धन्यवाद, बस मैं जो खोज रहा था। – Johan

1
  1. हां। मेरा अनुमान है कि आप कुछ डिबग पर्यावरण Firebug, jsFiddle, आदि, जो परोक्ष एक गुंजाइश

  2. आपको लगता है कि स्वयं को क्रियान्वित गुमनाम समारोह में मूल्य 2 पारित में है कि कोड लपेटता है, और आप का उपयोग कर सकते है जैसे कि कोड निष्पादित है स्थानीय तर्क foo के माध्यम से मूल्य। चूंकि स्कोप चेन लुकअप हमेशा नीचे-> काम करता है, उस चर नाम के समाधान को स्थानीय दायरे पर रोक दिया जाता है, जहां foo तर्क के रूप में पाया जाता है।

1
  1. window.foo === '1', जब तक कि आप इसे किसी अन्य फ़ंक्शन के अंदर नहीं चलाते।
  2. foo === '2' बंद होने के अंदर, क्योंकि आपने फ़ंक्शन के इनपुट तर्क के रूप में foo घोषित किया था। यदि आप उसी नाम से स्थानीय रूप से स्कॉप्ड वैरिएबल घोषित करने का निर्णय नहीं लेते हैं तो आप विश्व स्तर पर स्कॉप्ड foo तक पहुंच सकते हैं।
0
  1. हां। शायद आप undefined के रूप में चर foo देखकर क्योंकि आप फ़ायरबग या jsfiddle (संबंधित https://stackoverflow.com/a/11572991/975520)
  2. सं पैरामीटर foo चर foo के ऊपर लिख तरह एक डिबग वातावरण में अपनी स्क्रिप्ट चला रहे हैं कर रहे हैं। लेकिन यह अभी भी एक वैश्विक चर है, इसलिए आप इसे window.foo के रूप में उपयोग कर सकते हैं।
संबंधित मुद्दे