2

最初に関数をすぐに (タイムアウトなしで) 実行したいので、次のようにします。

setInterval(function(){
    alert("Boo");
}(), 1000);

関数は最初に実行されましたが、次の間隔では何も起こりませんでした。なんで?

4

7 に答える 7

6

より良い質問は、実際に何を達成しようとしているのかということです。

return自己呼び出し関数から何もしないので、undefined暗黙的に値を返します。これは に渡されsetTimeoutます。最初の呼び出しの後、回線は次のようになります。

setInterval(undefined, 1000); 

これは明らかに意味がなく、何も呼び出しません。

自己呼び出し関数から別の関数に移動する必要があるかreturn、自己呼び出し関数を使用せずに関数参照を渡すだけです。


アップデート:

質問を更新しました。init で「一度」関数を実行し、その後間隔で使用する場合は、次のようにすることができます

setInterval((function() {
    function loop() {
        alert('Boo');
    };

    loop();
    return loop;
}()), 1000);
于 2012-12-07T22:18:17.627 に答える
3

これは、渡されるのではなく、呼び出されるためです。すぐに呼び出したい場合は、名前を付けて返します。

setInterval(function foo() { 
    alert("boo"); 
    return foo; 
}(), 1000);

これは、名前付き関数式と呼ばれます。fooほとんどのブラウザでは、識別子は内部でのみ使用可能であることに注意してくださいfoo。ただし、古いIEには、識別子が外部スコープにリークする原因となる問題があります。

これは通常問題にはなりませんが、関数名を選択する際には注意が必要です。

于 2012-12-07T22:24:48.190 に答える
3

間隔を設定するには、関数から返される undefined ではなく、関数参照が必要です。無名関数の末尾にある「()」を削除するだけです。

于 2012-12-07T22:18:45.800 に答える
2

これが私のアプローチとして過去に行ったことです:

(function loop () {
   // do stuff
   window.setTimeout(loop, 1000);
})();
于 2012-12-07T22:33:15.210 に答える
2

「見えるsetInterval」のは、自己実行関数の戻り値undefinedだからです - 。

代わりにこれを試してください:

    setInterval(function()
        {
             alert("Boo");
             return arguments.callee;

        }(), 1000);

注:
I Hate Lazy が指摘したように、 Strict Modearguments.calleeでは許可されていません。

于 2012-12-07T22:20:16.583 に答える
1

あなたはそれをこのように書くことができます:

setInterval((function() {
    function boo() {
        alert("boo");
    };
    boo();
    return boo;
})(), 1000);​

ただし、区間外で関数を宣言することをお勧めします。

于 2012-12-07T22:24:42.277 に答える
1

自己実行関数は、の引数として使用する関数を返さないsetIntervalため、呼び出しの前に警告を表示し、それ以降は基本setIntervalsetIntervalにノーオペレーションです。

必要に応じて、 Firefox が空の呼び出しについて不平を言っているのを見ることができますsetInterval

于 2012-12-07T22:21:01.623 に答える