return 的函数,为什么被执行了?

fishenal
  • 3.4k

如下代码:

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

按理说 500毫秒以后,函数只是被return了,但是实际是console被执行了,请问是为什么?

回复
阅读 3.1k
4 个回答

因为 setTimeout 就是在指定延时之后执行第一个参数,也就是传入的函数。

你以为 setTimeout 执行的是:

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

但其实这一串是一个 IIFE,当解释器读到这些代码的时候就已经把它执行了,然后返回了:

function() {
    console.log(j)
}

所以,500ms 过后,setTimeout 实际执行的正是被返回之后的这个函数体。

函数是只是被return了,然后作为第一个参数传给了setTimeout,这不就是setTimeout的用法么?

大家都说到点子上了,我给个正确答案吧。

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

setTimeout(*func,delay);
setTimeout的第一个参数是一个函数指针;
你的代码中,外层匿名函数立即执行后返回的是内层匿名函数的指针,因此内层函数被执行。

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