2016-03-10 34 views
0

我有一個簡單的程序,我第一次在瀏覽器中運行。我在行6。當我試圖找出a,b的值 - 瀏覽器以值'undefined'響應。但是,當我試圖找出價值c,當然哪些不存在它給我一個錯誤。通過簡單的程序JS的變量識別

我的問題是,當我在線6調試 - b & C的狀態必須是相同的 - 要麼兩個「未定義」或兩個「給錯誤」,因爲在線路程序中沒有6,a存在 - 但是都是 - b & c是處於這種程序狀態的幽靈,那麼它是如何給b定義爲undefined和c爲錯誤(哪個粗略是正確的)。但是,程序何時發現我使用哪些變量,哪些不是,當我還在中間時,在程序的前半部分,首次運行它。

enter image description here

回答

1

JavaScript的變量聲明。這意味着即使在代碼執行之前,JavaScript也會在當前環境中爲源中的每個變量聲明創建綁定,並使用undefined對它們進行初始化。你在哪裏第三行打破

var a; 
    var b; 
> a = ...; 
    b = ...; 

你能想到的評估順序爲。

當前環境中沒有綁定c,這就是爲什麼它會拋出ReferenceError。

另請參閱Javascript function scoping and hoistingmany others

+0

任何標準的鏈接,文檔? – Deadpool

+0

如果你想閱讀規範:http://www.ecma-international.org/ecma-262/6.0/index.html#sec-globaldeclarationinstantiation第16步的全球環境和http://www.ecma-international .org/ecma-262/6.0/index.html#sec-functiondeclarationinstantiation步驟27和28的功能。否則,各種資源提供更容易理解的解釋,例如https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting或https:// github。com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch4.md,但它們不是「標準」的。 –

1

那是因爲吊裝。

作爲變量a和b在腳本中聲明,js編譯器將在執行時將它們移動到腳本的頂部。

代碼

var a=['apple','mango']; 
var b=[{color:'red'}]; 

在執行編譯移動聲明到腳本的頂部。

var a; 
var b; 
a=['apple','mango']; 
b=[{color:'red'}]; 

所以當你訪問ab,你會看到undefined作爲他們value.but仍然c沒有declared.so你會得到異常