我对 JS 比较陌生,所以这可能是一个常见问题,但我在处理 for 循环和 onclick 函数时注意到一些奇怪的事情。我能够用这段代码复制这个问题:
<html>
<head>
<script type="text/javascript">
window.onload = function () {
var buttons = document.getElementsByTagName('a');
for (var i=0; i<2; i++) {
buttons[i].onclick = function () {
alert(i);
return false;
}
}
}
</script>
</head>
<body>
<a href="">hi</a>
<br />
<a href="">bye</a>
</body>
</html>
单击链接时,我希望得到“0”和“1”,但我却得到了“2”。为什么是这样?
顺便说一句,我设法通过使用“this”关键字解决了我的特定问题,但我仍然很好奇这种行为背后的原因。
你正拥有的一个非常常见的闭包问题 in the for
loop.
封闭在闭包中的变量共享同一个环境,所以到了onclick
回调被执行,循环已经运行并且i
变量将保留指向最后一个条目。
您可以使用函数工厂通过更多闭包来解决此问题:
function makeOnClickCallback(i) {
return function() {
alert(i);
return false;
};
}
var i;
for (i = 0; i < 2; i++) {
buttons[i].onclick = makeOnClickCallback(i);
}
如果您不熟悉闭包的工作原理,这可能是一个相当棘手的话题。您可以查看以下 Mozilla 文章以获取简要介绍:
注意:我还建议不要使用var
在 - 的里面for
循环,因为这可能会欺骗你相信i
变量具有块作用域,而另一方面i
变量就像buttons
变量,作用域在函数内。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)