最初に関数をすぐに (タイムアウトなしで) 実行したいので、次のようにします。
setInterval(function(){
alert("Boo");
}(), 1000);
関数は最初に実行されましたが、次の間隔では何も起こりませんでした。なんで?
最初に関数をすぐに (タイムアウトなしで) 実行したいので、次のようにします。
setInterval(function(){
alert("Boo");
}(), 1000);
関数は最初に実行されましたが、次の間隔では何も起こりませんでした。なんで?
より良い質問は、実際に何を達成しようとしているのかということです。
return
自己呼び出し関数から何もしないので、undefined
暗黙的に値を返します。これは に渡されsetTimeout
ます。最初の呼び出しの後、回線は次のようになります。
setInterval(undefined, 1000);
これは明らかに意味がなく、何も呼び出しません。
自己呼び出し関数から別の関数に移動する必要があるかreturn
、自己呼び出し関数を使用せずに関数参照を渡すだけです。
アップデート:
質問を更新しました。init で「一度」関数を実行し、その後間隔で使用する場合は、次のようにすることができます
setInterval((function() {
function loop() {
alert('Boo');
};
loop();
return loop;
}()), 1000);
これは、渡されるのではなく、呼び出されるためです。すぐに呼び出したい場合は、名前を付けて返します。
setInterval(function foo() {
alert("boo");
return foo;
}(), 1000);
これは、名前付き関数式と呼ばれます。foo
ほとんどのブラウザでは、識別子は内部でのみ使用可能であることに注意してくださいfoo
。ただし、古いIEには、識別子が外部スコープにリークする原因となる問題があります。
これは通常問題にはなりませんが、関数名を選択する際には注意が必要です。
間隔を設定するには、関数から返される undefined ではなく、関数参照が必要です。無名関数の末尾にある「()」を削除するだけです。
これが私のアプローチとして過去に行ったことです:
(function loop () {
// do stuff
window.setTimeout(loop, 1000);
})();
「見えるsetInterval
」のは、自己実行関数の戻り値undefined
だからです - 。
代わりにこれを試してください:
setInterval(function()
{
alert("Boo");
return arguments.callee;
}(), 1000);
注:
I Hate Lazy が指摘したように、 Strict Modearguments.callee
では許可されていません。
あなたはそれをこのように書くことができます:
setInterval((function() {
function boo() {
alert("boo");
};
boo();
return boo;
})(), 1000);
ただし、区間外で関数を宣言することをお勧めします。
自己実行関数は、の引数として使用する関数を返さないsetInterval
ため、呼び出しの前に警告を表示し、それ以降は基本setInterval
的setInterval
にノーオペレーションです。
必要に応じて、 Firefox が空の呼び出しについて不平を言っているのを見ることができますsetInterval
。