2

私はjavascriptで関数を持っています:

function test(){
...
    if (){
        setTimeout(test(), 1000);
    }
}

マニュアルによると、私はこれを呼び出すことができます:

setTimeout(test(), 1000);

実際、呼び出しますが、1 を待ちません。だから私は次のようにそれを使用しようとすると、動作します。

setTimeout(function(){test();}, 1000);  

誰でも私にこれを説明できますか?

4

3 に答える 3

3

どのマニュアル?呼び出しtest()は によって返されたものを呼び出してtest()に渡すsetTimeoutため、関数を返さない限りtest()、これは機能しません。

anon 関数の代替を使用することも、.setTimeout(test, 1000)なしのように渡すこともできます()

途中で見つける可能性のある別の悪い使用法は、次のような文字列として渡すことです。

setTimeout("test()", 1000)

これは呼び出しと同等でevalあり、遅かれ早かれスコープの問題に遭遇するため、これは絶対に避けてください。

于 2012-06-21T07:20:38.243 に答える
2

あなたはで呼び出す必要があります

setTimeout(test, 1000);

とではありません

setTimeout(test(), 1000);

つまり、1000 ミリ秒後に呼び出したい関数はテストであり、テストを呼び出した結果ではありません!

その理由

setTimeout(function(){test();}, 1000);  

機能するのは、1000ミリ秒後に呼び出す関数がテストを呼び出す関数であり、基本的にtestそれ自体であるということです。ラムダ計算オタクにとって、これはイータ還元と呼ばれます。

于 2012-06-21T07:22:23.240 に答える
1

setTimeout関数参照が必要です。これを渡すと:

setTimeout(test(), 1000);

これは、関数を呼び出した結果を に渡しています。代わりに、それ自体をテストするための参照を渡します。testsetTimeout

setTimeout(test, 1000);

ファンシーなものを見たいですか?

function test () {
    var what_are_you = 'a closure';
    return function () {
       alert('I am '+what_are_you+'!')
    }
}
setTimeout(test(), 1000);

ここでは、関数呼び出しから関数参照を返しています。について詳しくは以下の記事をご覧ください!

ドキュメンテーション

于 2012-06-21T07:23:03.307 に答える