我有以下代码片段。
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 个片段引用自此处。正如作者的解释一样,闭包很神奇。
但是它是如何工作的以及闭包如何使它工作都超出了我的理解。为什么第一个不起作用而第二个起作用?谁能详细解释一下这个魔法?