Javascript臭名昭著的Loop问题?
2022-08-30 00:52:55
我有以下代码片段。
function addLinks () {
for (var i=0, link; i<5; i++) {
link = document.createElement("a");
link.innerHTML = "Link " + i;
link.onclick = function () {
alert(i);
};
document.body.appendChild(link);
}
}
上面的代码用于生成 5 个链接,并将每个链接与警报事件绑定,以显示当前链接 ID。但它不起作用。当您单击生成的链接时,它们都说“链接5”。
但以下代码片段符合我们的期望。
function addLinks () {
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);
}
}
以上2个片段从这里引用。正如作者的解释似乎使闭合变得神奇。
但是它是如何工作的,闭包是如何使它起作用的,这些都超出了我的理解范围。为什么第一个不起作用,而第二个工作?任何人都可以详细解释一下魔法吗?