在下面的代码片段中,为什么以及如何调用函数形成一个全新的执行上下文,其中i的值被保留?
function getHandler(n) {
return function() {
alert( 'You clicked on: ' + n );
};
}
for (var i = 0; i < 100; ++i) {
myElements[i].onclick = getHandler(i);
}
答案 0 :(得分:2)
这是由JavaScript闭包和JavaScript中for循环中声明的变量行为引起的。因为参数n
是addHandler
闭包的一部分,所以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以及它们如何运作。