通过闭包解决循环异步问题

在循环当中,如果调用回调函数,往往不能如愿,如:

1
2
3
4
5
for(var k=0;k<10;k++){
setTimeout(function(){
console.log(k);
},100);
}

按照正常想法,你可能会认为在控制台中会输出0到9,但实际上最后输出的结果是999999999,为什么会这样呢,很简单,因为回调函数是延迟执行,因此当循环执行完时,才在控制台中输出k值,而这时候相当于十个函数共享一个k值,那必然是得不到你想要的结果。

想要解决,需要使用闭包,方法如下:

1
2
3
4
5
for(var k=0;k<10;k++){
(function(j){
console.log(j);
})(k);
}

通过IIFE(立即函数执行表达式,不懂自行google),即可形成一个新的块级作用域,而这个块级作用域保留了循环时的k值,从而完成了最终我们要达到的效果。