一个学习案例中遇到的问题
index.html
<div class="d-flex gap-3">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
index.css
.box {
width: 100px;
height: 50px;
border: 1px solid;
}
index.js
var boxs = document.getElementsByClassName('box');
for (var i = 0; i < boxs.length; i++) {
boxs[i].onclick = function () { // i = 1,2,3
console.log(i); // i = 3
}
}
上述代码中, 我在循环里为每个 .box
添加点击事件, 但是在事件里的i始终是循环体执行完毕后的结果 3, 为什么会出现这种情况?
因为之前写代码在 onclick 事件里基本都是用 this, 或者用 let 来代替 var 来定义变量, 所以绕过了这个坑
但现在遇到了这样的 bug, 还是想问下导致这个问题的原因是什么?
补充
关于 var 的特性, 我能想到的是 全局污染和变量提升, 简单地说
- 全局污染: for 中定义 var, 作用域会提升到全局
- 变量提升: 允许先调用后定义
但是上述两个特性都不能合理的解释 -> 为什么在for循环中定义的onclick, 循环变量i在onclick事件中永远是for最终执行后的i?
你换个思路,在你的代码中有几个i呢,是不是只有一个,所有当for循环结束i的值也只能是一个,因为i一个变量不可能同时又是1又是2又是3