碰到一道题,是这样的
for(var i=0;i<3;i++){
setTimeout(function(){
console.log(i);
},200)
}
//问最后的输出结果?
结果是333
是不是很惊讶?
来说说原因:
这里涉及到同步&异步
的概念。
事件的执行是异步的,异步代码会被置于一个特殊的等待队列中,它只会在浏览器“有空闲时间”的时候才会执行。
所以当执行打印的时候i
已经递增到3
了,没错,就是3
;原因是每次循环完会先自增再判断,所以是3
。
看这个,这个最后的输出就是3
:
for(var i=0;i<3;i++){}
console.log(i);
解决方法
- 将
var
改为let
,因为let
具有块级作用域 - 封装成匿名立即执行函数 并定义一个局部变量j
for(var i=0;i<lis.length;i++){
(function(j){
lis[i].addEventListener('click',function(){
console.log(j);
},false);
})(i);//将i作为参数传给j
}