Home  >  Q&A  >  body text

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

如下代码:

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

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

伊谢尔伦伊谢尔伦2749 days ago413

reply all(4)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 14:25:42

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

    你以为 setTimeout 执行的是:

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

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

    function() {
        console.log(j)
    }
    

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

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:25:42

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

    reply
    0
  • PHPz

    PHPz2017-04-10 14:25:42

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

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

    reply
    0
  • 阿神

    阿神2017-04-10 14:25:42

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

    reply
    0
  • Cancelreply