【发布时间】:2018-08-17 03:18:56
【问题描述】:
我曾经认为用 var 声明的变量的范围涵盖了 {} 之间的整个范围,但我尝试了以下示例,我想解释一下为什么我在回调函数中使用 'i' onclick 事件监听器的值不是 for 循环的索引,而是 for 循环完成后 i 的值。谢谢。
<html>
<head>
</head>
<body>
</body>
<script>
var components = ["1obj", "2obj", "3obj", "4obj", "5obj"];
createDivs(components);
function createDivs(components) {
for (var i = 0; i < components.length; i++) {
var image = document.createElement('div');
image.innerHTML = components[i];
image.index = i;
image.onclick = function () {
console.log(this.index); //gives the real index
console.log(i); //gives the length of components+1
};
document.body.appendChild(image);
}
}
</script>
</html>
【问题讨论】:
-
使用 let 获得预期结果,查看此链接 - stackoverflow.com/questions/32313961/…
-
this在 onclick 函数内部发生变化。这是一个新的范围。 -
由于词法作用域,i 也是最后一个索引的值。当 onclick 发生时,我将永远是最后一个索引。您可以将 i 注入闭包中。看我的回答。
-
@Ali Chamas,你看我的回答了吗?
-
@jdmdevdotnet 是的,我确实感谢您的回答,我将其标记为正确的。伟大的解释完美地工作。关于这一点,我已经将索引值存储在 .index 中,因此它可以使用 this.index 工作,但您的解决方案更好,因为它是正确的方法,无需添加以后可能会造成混淆的新属性。
标签: javascript