javascript - return 的函数,为什么被执行了?
伊谢尔伦
伊谢尔伦 2017-04-10 14:23:42
0
4
456

如下代码:

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

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

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全員に返信(4)
Ty80

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

你以为 setTimeout 执行的是:

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

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

function() {
    console.log(j)
}

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

いいねを押す +0
伊谢尔伦

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

いいねを押す +0
PHPzhong

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

for(var i=0, l=5; i<l; i++) {
    (function(number){
        setTimeout(function(){return function(){console.log(number)}}, 500);
    }(i));
}
いいねを押す +0
阿神

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート