功能保留参数

时间:2012-05-23 03:20:27

标签: javascript javascript-events

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

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

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

1 个答案:

答案 0 :(得分:2)

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

Here is a fiddle showing that behavior

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

Here is a fiddle showing that behavior

由于关闭,n将存在,无论在addHandler(在这种情况下是否存在某些函数引用)中创建的任何内容都存在。

我希望这是有道理的。我认为解释起来很棘手。

编辑:Here is an awesome explanation of JavaScript closures以及它们如何运作。