2013-07-08 65 views
12

上執行分配變量名相同的變量名

var a=b=c=d=e=f=a; 
//no error(a has not initialize before) 

var x=y; 
//ReferenceError: y is not defined 

如何能在第一個代碼只執行彷彿a已經被初始化之前。

+5

第一條語句是像'VAR一個=未定義; window.b = window.c = window.d = window.e = window.f = a;'第二個'y沒有定義' – rab

+1

@rab只是發佈那個答案。這是正確的 – rossipedia

回答

11

這是因爲可變懸掛。 var x = EXPR;實際上是轉換成這樣:

// beginning of the block (function/file) 
var x; // === undefined 
// ... 
// the actual position of the statement 
x = EXPR 

對於你的榜樣,這意味着:只有a使用var聲明

var a; // === undefined 
a = b = c = d = e = f = a; 

注 - 讓你創建噸全局的是總是一件壞事

+0

所以,如果刪除了''在表達式的末尾,這將導致一個錯誤,但如果不是,它會創建全局和分配的'了'價值,所有的變量? – Givi

+1

是的,這是正確的。如果刪除最後一個'a',則不存在的'f'將被讀取並導致異常,因爲它不存在。 – ThiefMaster

5

你的第一條語句就像

var a = undefined; 
a = window.b = window.c = window.d = window.e = window.f = a; 

其中定義,和其他人是全球範圍的。假設你執行一個函數。

(function(){ 
    var a=b=c=d=e=f=a; 
    b = 10; 
}()); 

b可以在外面訪問。

在第二var x=yy還沒有定義

+1

小幅調整:訪問全球'x'不太一樣訪問'window.x':'window.x'永遠不會失敗,但如果''x'完全不存在x'失敗。 – ThiefMaster