请问setTimeout()这两段代码的区别

1、这段代码一次输出i,为什么不是每秒钟逐个输出i:

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

这段可以:

    for(var i = 0 ; i < 5; i++){
        setTimeout((function(i){
                return function(){console.log(i)}
        })(i), 1000*i);
    }

帮我解释下?

阅读 2.1k
2 个回答

因为setTimeout第一个参数为函数时候才会有延时效果,第一个例子中是立即执行了,相当于

for(var i = 0 ; i < 5; i++){
    setTimeout(console.log(i), 1000*i);
}

这个现象我不太清楚,但是我可以试着解释一下,
setTimeout(callback,1000)这里面的callback是个方法体,不是执行结果,
(function(i){

        console.log(i)
    })(i)

你这就闭包执行了,相当于第一个方法体没传。可能是都没方法体所以执行快吧

第二个,
(function(i){

            return function(){console.log(i)}
    })(i)

你闭包执行完返回了个方法体,所以和正常的事例没区别,所以正常。

你可以搜搜setTimeout的js功能详解实现了解一下这个函数

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题