BeWithYou

胡搞的技术博客

  1. 首页
  2. web前端/Javascript
  3. Javascript循环中异步操作的一个坑

Javascript循环中异步操作的一个坑


今天遇到一个问题,for循环中的闭包允许内层函数引用父函数中的变量,但它的值是最终的值。例子如下:

var arr = [1,2,3];
for(var i=0;i<arr.length;i++){
    setTimeout(function(){
        console.log(i);
        },1000);
}
//ouput
//3
//3
//3

那么如何取到正确的值呢?数组元素的话使用forEach是可以的。

var arr = [1,2,3];
arr.forEach(function(e){
    setTimeout(function(){
        console.log(e);
        },1000);
});
//ouput
//1
//2
//3

但是如果不是数组,是一个对象,不能使用forEach呢?目前想到两个方法。
1.里层用匿名函数闭包包起来,把i当做参数穿进去

var obj = {"a":1,"b":2};
for(var i in obj){
    (function(c){
    setTimeout(function(){
        console.log(c);
    },1000);
    })(i);
}

2.使用ES6的let

"use strict";
let obj = {"a":1,"b":2};
for(let i in obj){
    setTimeout(function(){
        console.log(i);
    },1000);
}
回到顶部