0

内部関数は、有効期限が切れた後に親関数を呼び出すにはどうすればよいですか?

setTimeout(main, 2000);
function main(){
    /* .... code */
    setTimeout(console.log("hello after 5 seconds"), 5000);
}

意図したアクションはhello after 5 seconds、5 秒 (合計 7) で印刷することです。上記のコードを使用すると、2 秒で印刷されます。

4

3 に答える 3

3

setTimeout関数参照を渡す必要があります。で、すぐsetTimeout(console.log("hello after 5 seconds"), 5000);に呼び出します。関数名の後に書くときはいつでも、それを呼び出しています。console.log ()

console.logはundefinedを返します。これが に渡されsetTimeoutます。未定義の値を無視するだけで、何もしません。(そして、それはエラーをスローしません。)

コールバック関数にパラメーターを渡す必要がある場合は、いくつかの方法があります。

匿名関数:

setTimeout(function() {
    console.log('...');
}, 5000);

関数を返します:

function logger(msg) {
    return function() {
        console.log(msg);
    }
}

// now, whenever you need to do a setTimeout...
setTimeout(logger('...'), 5000);

これが機能するのは、呼び出すloggerと単に を閉じる新しい無名関数が返されるためmsgです。返された関数は、実際に に渡されるものsetTimeoutであり、コールバックが起動されるとmsg、クロージャーを介して にアクセスできます。

于 2012-08-01T15:31:48.717 に答える
2

私はあなたが何を望んでいるのか理解したと思います。見てください:

var main = function(){
    console.log("foo");
    var function1 = function( string ) {
        console.log("function1: " + string);
    };
    var function2 = function() {
        console.log( "hadouken!" );
    };
    // you will need to use a closure to call the function
    // that you want with parameters
    // if you dont have parameters, just pass the function itself
    setTimeout(function(){ function1("bar") }, 5000);
    setTimeout(function2, 6000);
}
setTimeout(main, 2000);

または:

function main(){
    console.log("foo");
    function function1( string ) {
        console.log("function1: " + string);
    };
    function function2() {
        console.log( "hadouken!" );
    };
    // you will need to use a closure to call the function
    // that you want with parameters
    // if you dont have parameters, just pass the function itself
    setTimeout(function(){ function1("bar") }, 5000);
    setTimeout(function2, 6000);
}
setTimeout(main, 2000);

私は通常、最初のsintaxを好みます。

jsFiddle: http: //jsfiddle.net/davidbuzatto/65VsV/

于 2012-08-01T15:39:26.960 に答える
1

それは動作します!あなたは言葉を逃しますfunction

setTimeout(main, 1000);

function main() {
    function function1 () { alert(1); };
    setTimeout(function1, 1000);
}​
于 2012-08-01T15:37:13.560 に答える