4

循环和闭包
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)
}

结果就出来了

clipboard.png

还有一种最简单有效的方法是for循环中的变量用let声明,let会让每次迭代都会声明。

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

结果也能出来。

clipboard.png


moye
1.3k 声望49 粉丝

不积硅步无以至千里