通过闭包解决循环异步问题 发表于 2017-02-20 在循环当中,如果调用回调函数,往往不能如愿,如: 12345for(var k=0;k<10;k++){ setTimeout(function(){ console.log(k); },100);} 按照正常想法,你可能会认为在控制台中会输出0到9,但实际上最后输出的结果是999999999,为什么会这样呢,很简单,因为回调函数是延迟执行,因此当循环执行完时,才在控制台中输出k值,而这时候相当于十个函数共享一个k值,那必然是得不到你想要的结果。 想要解决,需要使用闭包,方法如下: 12345 for(var k=0;k<10;k++){ (function(j){ console.log(j); })(k);} 通过IIFE(立即函数执行表达式,不懂自行google),即可形成一个新的块级作用域,而这个块级作用域保留了循环时的k值,从而完成了最终我们要达到的效果。