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 ?它应该提示 4 。提示的原因是什么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 仍然可以引用 argx
和tmp
,即使它不再直接位于范围内。
这证明了闭包也引用了参数值,而不是为什么上面的代码每次都没有提醒 4?