2014-03-07 28 views
2

我在接受採訪時得到了這個問題,我很好奇,爲什麼兩個輸出不同的東西:的Javascript全球引用錯誤

(function() { 
    console.log(bar); 
    console.log(baz); 
    foo(); 

    function foo() { 
     console.log('aloha'); 
    } 

    var bar = 2; 
    baz = 3; 
})(); 

。OUPUTS:

undefined 
Uncaught ReferenceError: baz is not defined 

而:

(function() { 
    console.log(bar); 
    console.log(window.baz); 
    foo(); 

    function foo() { 
     console.log('aloha'); 
    } 

    var bar = 2; 
    baz = 3; 
})(); 

輸出:

undefined 
undefined 
'aloha' 

bazwindow.baz被引用的方式有什麼不同?我雖然全局自動附加到窗口?

+0

我認爲真正的問題是爲什麼記錄'bar'不會拋出錯誤。至少我對此很好奇。 – alalp

+0

當你的問題只是關於'baz'和'window.baz'之間的區別時,你爲什麼需要發佈所有其他代碼? – Barmar

+0

因爲這是我逐字問到的。我想我可以刪除其他的東西。 – moesef

回答

1

甲的ReferenceError表示一個無效的基準值已被檢測到(ECMA 5 15.11.6.3)

在實際應用中,這意味着當JavaScript的試圖得到一個不可解決的 的值的ReferenceError將被拋出參考。 (ECMA中嚴格5模式下運行時,有其他情況下,一個的ReferenceError將 拋出,最值得注意的是,在這篇文章的結尾,如果你感興趣 檢查閱讀清單)

進一步的閱讀起飛一看here

+1

感謝您的鏈接。這就是我正在尋找的那種深入的解釋。 – moesef

0

因爲函數定義是在執行前評估的,所以變量賦值表達式不是。

+0

那麼,爲什麼登錄'酒吧'不會拋出錯誤? – alalp

+0

bar不會因Javascript產生錯誤提示原理 – moesef

+0

我相信var defs在執行前也會被編譯器記錄下來,但是賦值並不是。這將解釋所有的行爲。 – shredmill

0

這是因爲console.log(window.baz);正試圖找到窗口對象內部的變量,其中console.log(baz)正試圖獲得一個獨立的變量,它尚未定義。