【发布时间】:2013-03-25 12:51:39
【问题描述】:
for (var i=0, link; i<5; i++) {
link = document.createElement("a");
link.innerHTML = "Link " + i;
link.onclick = function (num) {
return function () {
alert(num);
};
}(i);
document.body.appendChild(link);
}
由于嵌套函数是一个闭包,它引用了 num 参数,循环末尾的 num 参数是 4 。现在,当第一个元素被点击时,为什么它会提示 1 ?它应该alert 4 .alerting 1 的原因是什么?不要引用num 参数吗?或者是什么原因?
但这里的情况不同:
function foo(x) {
var tmp = 3;
return function (y) {
alert(x + y + (++tmp));
}
}
var bar = foo(2); // bar is now a closure.
bar(10);
上述函数将警告 16,因为 bar 仍然可以引用 arg x 和 tmp,即使它不再直接位于范围内。
这证明闭包也引用了参数值而不是为什么上面的代码每次都没有警报 4?
【问题讨论】:
-
当您在当前迭代中将参数
i传递给具有参数num的内部onclick函数时,它会在单击第一个元素时发出警报1。 -
This question on SO 有一些很好的答案可以帮助你理解闭包
-
它实际上应该是警报 0,因为那是你传递的第一个 #
标签: javascript closures