for(var i=1;i<=5;i++){ setTimeout(function timer(){
console.log(i);
},i*1000);
}
1 回答

青春有我
TA贡献1784条经验 获得超8个赞
首先js没有严格意义的块作用域,块作用域可以用一个立即调用的函数来模拟
然后你的这段代码和块作用域无关,这是一个js闭包的问题,所谓闭包就是可以访问另一个函数作用域中变量的函数,所以这里的setTimeout是一个闭包,它在for语句所在的作用域被调用,在它内部可以访问for语句中定义的(但不是在它自己作用域内)变量i,这是因为闭包保存了包含函数的整一个变量对象
所以,i从1到5,循环体执行5次,当最后因为i变为6跳出循环时,因为闭包引用的是外部作用域的整一个变量对象,也就引用了外部的这个i,所以每次输出的这个i就是外部的i,就是6
于是就是5次6
添加回答
举报
0/150
提交
取消