1

在下面的代码片段中,调用函数为什么以及如何形成一个全新的执行上下文,其中 i 的值被保留?

function getHandler(n) {
    return function() {
        alert( 'You clicked on: ' + n );
    };
}

for (var i = 0; i < 100; ++i) {
    myElements[i].onclick = getHandler(i);
}
4

1 回答 1

2

它是由 JavaScript 闭包和 JavaScript 中 for 循环中声明的变量的行为引起的。因为参数naddHandler's 闭包的一部分,所以 n 为在其内部声明的函数实例维护它的值。碰巧的是,您从全局空间中的 for 循环中传入 i 。

这是一个显示该行为的小提琴

如果你要做一些事情来增加n内部addHandler,你会发现它实际上并没有影响i。再一次,这是因为闭包,n存在于addHandler' 闭包内并且仅由i.

这是一个显示该行为的小提琴

由于闭包,无论在其中创建的任何内容(在这种情况下为一些函数引用)都n将存在多久。addHandler

我希望这是有道理的。我认为这很难解释。

编辑:这是对 JavaScript 闭包及其工作原理的精彩解释。

于 2012-05-23T03:38:59.283 回答