2016-04-27 90 views
0

在下面的代碼:嵌套功能喪失變量引用

function outer() { 
    var x = 'foo'; 

    function inner() { 
    var y = x;  // y == 'foo' 
    var x = 'bar'; // x == 'bar', y == undefined 
    } 
} 

爲什麼變量y成爲內inner()未定義?不應該是指在outer()

如果刪除行var x = 'bar';然後y確實具有值'foo'。

+6

這就是所謂的吊裝。 –

回答

2

inner功能被解釋爲好像它是這樣寫的:

function inner() { 
    var y; 
    var x; 
    y = x;  // y == undefined 
    x = 'bar'; // x == 'bar' 
    } 

聲明被懸掛,但初始化被處理從上到下。因此,在整個inner函數中,符號xy都指代在該函數中在本地中聲明的變量;特別是x是本地x,而不是封閉環境中的那個。當評估y的初始值表達式時,因此x是當地尚未初始化的x;其初始值表達式初始值爲y

+0

Downvoter,讓我知道是否有什麼我可以更詳細地解釋。 – Pointy