循环和闭包
for循环是最常见说明闭包的例子了,我分享一下自己踩的坑。
for(var i=1;i<=5;i++){
setTimeout(function timer(){
console.log(i)
},i*1000);
}
一开始我以为打印的结果是每秒打印出来1 2 3 4 5,没想到的是我错了
结果竟然是五个6.我去,什么鬼??
后来仔细想想延迟函数的回调会在循环结束时才执行,因此会输出五个6。那么问题来了,代码出了什么问题呢?原来是循环中每个迭代在运行时都会给自己捕获一个i,然后我该怎么做才能让它打印出我想要的结果呢?
我们需要更多的闭包作用域,特别是每个迭代都需要一个闭包作用域。
我是通过申声明并立即执行函数来创建一个函数来创建作用域。
for(var i=1;i<=5;i++){
(function (j){
setTimeout(function timer(){
console.log(j)
},i*1000);
})(i)
}
结果就出来了
还有一种最简单有效的方法是for循环中的变量用let声明,let会让每次迭代都会声明。
for(let i=1;i<=5;i++){
setTimeout(function timer(){
console.log(i)
},i*1000);
}
结果也能出来。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。