का भ्रमित संचालन मैंने var
कीवर्ड के साथ एक बहुत अजीब (मेरे लिए) समस्या में भाग लिया है। मैंने इसे काफी कम परीक्षण केस में कम कर दिया है, और पाया कि यह नोड.जेएस (इस प्रकार, वी 8 और क्रोम), सफारी 4 के इंस्पेक्टर (इस प्रकार, नाइट्रो), और फायरबग (जाहिर है, स्पाइडरमोन्की) में प्रदर्शित किया गया है। मैं मूल रूप से एक बग रिपोर्ट तैयार कर रहा था, लेकिन चूंकि यह इतना व्यापक रूप से प्रदर्शित होता है, इसलिए मुझे लगता है कि मैं पूरी तरह से गलत समझता हूं कि जावास्क्रिप्ट को किस प्रकार गुंजाइश और चर दिखाना चाहिए।जावास्क्रिप्ट `var` कीवर्ड
परीक्षण केस बहुत छोटा है, और यहां गिटहब पर: http://gist.github.com/260067। पहले और दूसरे उदाहरण के बीच एकमात्र अंतर var
कीवर्ड शामिल करना है। https://gist.github.com/698b977ee0de2f0ee54a
संपादित करें:: कैसे व्यापक गुंजाइश काम करता है समझाने के लिए प्रयास करने से किसी भी अधिक जवाब रोकता करने के लिए, मैं
यहाँ, साथ ही, एक ऐसी ही परीक्षण का मामला है कि एक अलग तरीके से एक ही 'समस्या' दर्शाती है मैं इसके साथ गहराई से परिचित हूँ। मेरे समस्या यह है कि मुझे समझ नहीं आता क्यों निम्नलिखित कोड 'काम करता है' है (कि यह alert()
s 'बाहरी', ', भीतरी' और उसके बाद फिर 'बाहरी' के बाद):
(function(){
var foo = 'outer';
alert("Outer `foo`: " + foo);
(function(){
foo = 'inner';
alert("Inner `foo`: " + foo);
var foo;
})();
alert("Outer `foo`: " + foo);
})();
var foo;
foo
के पुन: असाइनमेंट के लिए पूरी तरह से अप्रासंगिक स्थिति में होता है; तो यह असाइनमेंट को बहुत ही महत्वपूर्ण तरीके से क्यों प्रभावित करता है?
आप एक eval का उपयोग क्यों कर रहे हैं? आपके द्वारा पोस्ट किए गए कोड में eval का उपयोग करने का बिल्कुल कोई कारण नहीं है। समस्या का प्रदर्शन करने के लिए – Marius
। वास्तविक कार्यान्वयन बहुत अलग है; आप इसे यहां जंगली में देख सकते हैं: http://github.com/elliottcable/poopy.js/blob/new-acquire/lib/from.js#L193 – ELLIOTTCABLE
आपका अंतिम उदाहरण काम करता है क्योंकि 1) foo = 'inner'; पैरेंट स्कोप foo को मान निर्दिष्ट करता है, जिसे इस फ़ंक्शन तक पहुंच है। 2) आपको एक चर घोषित करने के लिए var का उपयोग करने की आवश्यकता नहीं है। – Marius