2011-09-22 14 views
5

संपादित करें ऐसा लगता है कि यह मेरे हिस्से और jsfiddle के उपयोग पर एक मुद्दा था:?जावास्क्रिप्ट hoisting को पूरी तरह से समझने की कोशिश कर रहे हैं

मैं हाल ही में होस्टिंग पर कुछ लेख पढ़ रहा हूं, एक by Nicholas Zakas है, और दूसरा by Ben Cherry है।

इम उदाहरण का पालन करने और सिर्फ अपने दम पर परीक्षण सुनिश्चित करने के लिए मैं पूरी तरह से यह समझ लेकिन मैं इस उदाहरण के साथ मुख्य रूप से कोई समस्या हो रही कोशिश कर रहा,

if (!('a' in window)) { 
    var a = 1; 
} 
console.log(a); 
प्रवेश undefined अपने प्रवेश 1 के बजाय

। अगर मैं सबकुछ सही ढंग से समझ रहा हूं, aundefined होना चाहिए, क्योंकि विंडो स्कोप में शीर्ष पर होने वाले विभिन्न कथन के कारण मौजूद होना चाहिए, इसलिए इसे मान असाइन नहीं किया जाना चाहिए।

लेकिन निम्नलिखित अपेक्षा के अनुरूप काम कर रहा है,

(function bar(){ 
    console.log(foo); 
    var foo = 10; 
    console.log(baz); 
})(); 

fooundefined है, और baz परिभाषित नहीं है। मेरे पास दोनों उदाहरणों के साथ fiddle है। वास्तव में बस इसके चारों ओर अपने सिर लपेटने की कोशिश कर रहा है। क्या कुछ लेख बदल गए हैं क्योंकि ये लेख शायद लिखे गए थे? यदि कोई इस पर कुछ प्रकाश डाल सकता है तो इसकी सराहना की जाएगी। परीक्षण करते समय क्रोम 14 का उपयोग कर रहा हूँ।

+0

मैं गूगल क्रोम में अपने बेला चल रहा हूँ और यह 'undefined' प्रिंट करता है। Hoisting की एक अच्छी व्याख्या के लिए आप * O'Reilly जावास्क्रिप्ट पैटर्न * पर एक नज़र डाल सकते हैं। एक समर्पित ** पैराग्राफ ** है। – user278064

+0

हाँ, स्पष्ट रूप से यह मेरे कारण jsfiddle सही ढंग से doh का उपयोग नहीं कर रहा था। – Loktar

उत्तर

2

दूसरे उदाहरण में करने के लिए, उत्थापन इस में कोड बदल देती है:

(function bar(){ 
    var foo; 
    console.log(foo); 
    foo = 10; 
    console.log(baz); 
})(); 

तो foo लॉग इन करने के पहले कॉल के दौरान अपरिभाषित है । घोषणापत्र हमेशा संलग्न समारोह के शीर्ष पर फहराया जाता है, लेकिन असाइनमेंट कभी इसके साथ नहीं फहराया जाता है।

+0

मुझे लगता है कि आपने एक टाइपो बनाया है। – pimvdb

+0

हाँ, थोड़ा सा – dtanders

1

object.a === undefined; // true, लेकिन a in object; // true

var object = {a: undefined}; 

('a' in object); // is true because a is a property of object 
2

आप JSFiddle onLoad करने के लिए सेट है, तो var a ऑनलोड समारोह के दायरे वाला। यह no wrap के लिए परिवर्तित करें और आपको मिलता है:

undefined 
undefined 
Uncaught ReferenceError: baz is not defined 
0

उत्थापन अलग तरह से समझ में आ, लेकिन मेरी समझ के लिए किया जाता है उसके द्वारा

है जब भी आप एक चर/कार्य बनाने के लिए यह एक स्मृति स्थान सेट you.It नहीं है के लिए निष्पादन संदर्भ के शीर्ष पर चर/फ़ंक्शन डालें।

कंसोल में 'यह/विंडो' टाइप करें, आप वहां अपने var/functions को वहां पर बैठे पाएंगे।

उदाहरण के लिए

:

a; //returns undefined 
b(); //returns Hello World 
var a = "Hello"; 
    function b() { 
     console.log('Hello World'); 
    } 

यह निष्पादन के दौरान शीर्ष पर रखा जाता है तो यह उत्पादन 'हैलो' 'अनिर्धारित' कार्यों excuted.Variables excuted चाहिए नहीं होगा मिल जाएगा नहीं मिलता है। कृपया वार्स excute के बाद यह घोषणा की जा रही है उत्थापन से बचने:

var a = "Hello"; 
    function b() { 
     console.log('Hello World'); 
    } 
a; //returns Hello 

b(); //returns Hello World