2011-09-22 55 views
5

編輯 看起來這是我的一個問題和我對jsfiddle的使用:?試圖完全理解JavaScript提升

我一直在閱讀一些關於最近吊裝的文章,一個是by Nicholas Zakas,另一個是by Ben Cherry

我試着去下面的例子,只是考驗我自己,以確保我完全掌握它,但有一個問題,林主要與這個例子中,

if (!('a' in window)) { 
    var a = 1; 
} 
console.log(a); 

而不是註銷undefined其記錄1的。如果我正確地理解了所有內容,a應該是undefined,因爲它的應該存在於窗口範圍內,因爲var語句被懸掛在最上面,所以它不應該被賦值。

但預期如下的作用下,

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

fooundefined,而沒有定義baz。這兩個例子都有fiddle。真的只是想把這個包裹起來。自從這些文章寫入以後有什麼改變了嗎?如果任何人都可以闡明這一點,將不勝感激。我在測試時使用Chrome 14。

+0

我跑在谷歌瀏覽器小提琴和它打印'undefined'。有關提示的一個很好的解釋,你可以看看* O'Reilly JavaScript Patterns *。 有一個專門的**段**。 – 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的作用範圍是在onLoad功能。將其更改爲no wrap,你會得到:

undefined 
undefined 
Uncaught ReferenceError: baz is not defined 
0

起重有不同的理解,但我的理解它的作用是

只要你創建一個變量/功能它建立了一個內存空間,you.It不把變量/函數放在執行上下文的頂部。

在控制檯鍵入'this/window',你會發現你的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