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
的论点?或者是什么原因?的Javascript闭合和其范围
但这里的情况是不同的:
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,因为酒吧仍然可以参考精氨酸x
和tmp
,即使它不再直接范围内。
这证明,所述封闭也有参考参数值比为什么上面的代码不告警4每次?
的第一个元素上点击,因为你正在传递参数'i'在当前迭代到具有参数内'onclick'功能时,它提醒''1' num' 。 –
[这个问题在SO](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work)有一些很好的答案,可以帮助你理解闭包 – excentris
它实际上应该是提醒0,因为那是您通过的第一个# –