2016-04-27 89 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