我有以下代码:
<html>
<body>
<p>para 1</p>
<p>para 2</p>
<script>
var allP = document.getElementsByTagName("p");
for (var i = 0; i < allP.length; i++) {
console.log(i);
allP[i].onclick = function () {
alert("p" + i + " was clicked."); // expected: i = 0..n-1; actual: i = n
}
}
</script>
</body>
</html>
当我打开控制台时,我可以看到循环迭代了两个段落标记:0
和1
被打印到日志中。
当我点击第一个p标签时,我现在希望收到一条警告,其中点击了“p 0 ”。然而,我得到的是“p 2 被点击了。”
为什么呢?我假设,当我将"p" + i + " was clicked."
传递给alert
时,i
会转换为字符串 - 但它似乎是对i
中存储的Number对象的引用(在调用匿名函数时会动态转换) - 当然,在循环运行后,n
(即allP.length
)。
有人可以向我解释发生了什么(当警报的参数被“构建”/评估时),这种行为被称为什么(我不认为像Java这样的编译语言,或像PHP3这样的解释语言/ 4,会表现那样吗?),以及我需要做些什么来获得我期待的行为(即让警报消息引用被点击的元素的索引(不必自己静态地写出每条消息))。