当闭包和单线程出现交叉时

167 阅读1分钟

一个闭包的切入问题

for (var i = 0; i < 5; i++) {
    setTimeout(function () {
        console.log(i + '');
    }, 100);
}

不能输出想要的结果,因为循环中的setTimeout接受的参数通过闭包访问变量i,javascript为单线程环境,setTimeout注册的函数需要等待线程空闲才能执行,此时for循环已经结束,i的值为5.

修改方法: 将setTimeout放在函数立即调用表达式中,将i值作为参数传递给包裹函数,创建新闭包

for (var i = 0; i < 5; i++) {
    (val => {
        setTimeout(function () {
            console.log(i + '');
        })
    })(i)
}