1

闭包规则是:函数使用定义时有效的作用域链执行。

在下面的 setTimeout 回调函数中,定义时 x 尚未在范围内。因此,程序应该打印 undefined,但打印的是 7,为什么?我错过了什么?

var foo = function () {
    setTimeout(function (){
        console.log(x);
    }, 3000);
};

var x = 7;
foo();

还是因为上面的代码和下面的完全一样?

var x = 7;

var foo = function () {
    setTimeout(function (){
        console.log(x);
    }, 3000);
};

foo();
4

1 回答 1

3

x 在定义时尚未在范围内

这不是真的。原因是吊装。基本上,JavaScript 会将 anyvar或 named移动function到包含范围的顶部。所以你实际上拥有的是更像这样的东西:

// these variables are hoisted
var x;
var foo;

// then the variables are assigned.
foo = function () {
    setTimeout(function (){
        console.log(x);
    }, 3000);
};

x = 7;
foo();

在此处阅读有关吊装的更多信息。


此外,这是准确的:

函数使用定义时生效的作用域链执行。

但你的解释并不准确。他们可以访问定义它们的范围,但不能访问定义它们的点。变量可以具有随时间变化的值,并且在这些范围内声明的函数将使用该范围内的最新值。没有时间机器。

所以当嵌套函数执行时,foo7因为在那个范围内,在那一刻,foo真的是7.

于 2013-12-25T03:25:29.013 回答