求教一个关于settimeout的问题

大馒头精 发布于 2017/03/10 10:30
阅读 140
收藏 0

有一个地方不是很理解,如图所示 settimeout是异步执行的, 而each是同步执行。

被循环的对象有6个子集合,为什么最后在控制台输出的是对象的6个子集合,而不是输出6次这个对象的最后一个子集合?

按理说在执行到settimeout的时候循环不是已经指向最后一个子集合了吗?

控制台的输出结构如下

 

加载中
0
您的好友
您的好友

你这个是闭包的问题啊   每次循环的时候 this都是不一样的  而且这个每次不一样的el也被分别带入到了settimeout里了   所以每次settimeout输出的都是不一样的  

写了四个代码片段  楼主可以感受一下

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8]


// 这个例子最后只输出最后一个值  
for (var i = 0; i < arr.length; i ++){
    var val = arr[i]
    setTimeout(function (){
        console.log(val)
    }, 200)
}


//  这个例子输出每一个值  和题主的代码是一样的情况
arr.forEach(function(val){
    setTimeout(function (){
        console.log(val)
    }, 200)
)


// 把前面那种改成这样  就和后面的是一样的效果了  这个效果题主应该是能理解的
function loop (val){
    setTimeout(function (){
        console.log(val)
    }, 200)
}
for (var i = 0; i < arr.length; i ++){
    var val = arr[i]
    loop(val)
}


// 为了方便还可以写成这样 闭包常见的形式
for (var i = 0; i < arr.length; i ++){
    var val = arr[i]
    (function (val){
        setTimeout(function (){
            console.log(val)
        }, 200)
    })(val)
}

 

0
wilbur_li
wilbur_li

在each方法中的 $(this)得到的是你循环元素的每一个对象  你在取循环出来对象的下标当然就是这个结果了。

返回顶部
顶部