在下面的代码片段中,调用函数为什么以及如何形成一个全新的执行上下文,其中 i 的值被保留?
function getHandler(n) {
return function() {
alert( 'You clicked on: ' + n );
};
}
for (var i = 0; i < 100; ++i) {
myElements[i].onclick = getHandler(i);
}
在下面的代码片段中,调用函数为什么以及如何形成一个全新的执行上下文,其中 i 的值被保留?
function getHandler(n) {
return function() {
alert( 'You clicked on: ' + n );
};
}
for (var i = 0; i < 100; ++i) {
myElements[i].onclick = getHandler(i);
}
它是由 JavaScript 闭包和 JavaScript 中 for 循环中声明的变量的行为引起的。因为参数n
是addHandler
's 闭包的一部分,所以 n 为在其内部声明的函数实例维护它的值。碰巧的是,您从全局空间中的 for 循环中传入 i 。
如果你要做一些事情来增加n
内部addHandler
,你会发现它实际上并没有影响i
。再一次,这是因为闭包,n
存在于addHandler
' 闭包内并且仅由i
.
由于闭包,无论在其中创建的任何内容(在这种情况下为一些函数引用)都n
将存在多久。addHandler
我希望这是有道理的。我认为这很难解释。
编辑:这是对 JavaScript 闭包及其工作原理的精彩解释。