回答:
function_reference
を含めない限り、これはすぐには実行されません()
。つまりはfunction_reference
そういうことだ-参照。渡すとfunction_reference()
、関数がすぐに呼び出されます。
他の誰もが言ったことに追加するだけですsetTimeout
:将来的にパラメータを使用して関数を呼び出す場合は、いくつかの匿名関数呼び出しを設定する必要があります。
後で呼び出すには、関数を引数として渡す必要があります。事実上、これは名前の後ろにブラケットがないことを意味します。以下は、アラートをすぐに呼び出し、「Hello world」を表示します。
var a = "world";
setTimeout(alert("Hello " + a), 2000);
これを修正するには、(Flubbaが行ったように)関数の名前を付けるか、無名関数を使用します。パラメータを渡す必要がある場合は、無名関数を使用する必要があります。
var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";
しかし、そのコードを実行すると、2秒後にポップアップに「Hello Stack Overflow」と表示されます。これは、この2秒間で変数aの値が変化したためです。2秒後に「Hello world」と表示するには、次のコードスニペットを使用する必要があります。
function callback(a){
return function(){
alert("Hello " + a);
}
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";
2秒待ってから、「Hello world」をポップアップします。
少し拡張するだけ... setTimeout
呼び出しでコードを直接実行できますが、@ patrickが言うように、通常は次のようにコールバック関数を割り当てます。時間はミリ秒です
setTimeout(func, 4000);
function func() {
alert('Do stuff here');
}
ブロッキング(同期)delay
関数が必要な場合(すべての目的で)、次のようにしてみませんか。
<script type="text/javascript">
function delay(ms) {
var cur_d = new Date();
var cur_ticks = cur_d.getTime();
var ms_passed = 0;
while(ms_passed < ms) {
var d = new Date(); // Possible memory leak?
var ticks = d.getTime();
ms_passed = ticks - cur_ticks;
// d = null; // Prevent memory leak?
}
}
alert("2 sec delay")
delay(2000);
alert("done ... 500 ms delay")
delay(500);
alert("done");
</script>
setTimeoutを使用し、それにコールバック関数を渡す必要があります。JavaScriptでスリープを使用できないのは、その間ページ全体が何もしないようにブロックするためです。良い計画ではありません。JavaScriptのイベントモデルを使用して、満足してください。戦わないで!
また、window.setInterval()を使用して、一定の間隔でコードを繰り返し実行することもできます。
setTimeout()
一度setInterval()
それを繰り返します。5秒ごとにコードを実行したい場合setInterval()
は、ジョブ用に作成されます。
遅延をテストするだけの場合は、これを使用できます。
function delay(ms) {
ms += new Date().getTime();
while (new Date() < ms){}
}
そして、2秒間遅延させたい場合は、次のようにします。
delay(2000);
しかし、生産には最適ではないかもしれません。詳しくはコメントで
を呼び出すための3つの異なるメソッドを使用したMauriusの説明(最高の賛成投票)が本当に気に入りましたsetTimeout
。
私のコードでは、AJAX保存イベントの完了時に前のページに自動的に移動します。保存イベントが完了すると、CSSにわずかなアニメーションが表示され、保存が成功したことが示されます。
私のコードで、最初の2つの例の違いを見つけました:
setTimeout(window.history.back(), 3000);
これはタイムアウトを待ちません-遅延のために何を入れても、back()はほとんどすぐに呼び出されます。
ただし、これを次のように変更します。
setTimeout(function() {window.history.back()}, 3000);
これはまさに私が望んでいたことを行います。
これはback()オペレーションに固有のものではなく、同じことがで発生しalert()
ます。基本的にalert()
最初のケースで使用されている場合、遅延時間は無視されます。ポップアップを閉じると、CSSのアニメーションが続きます。
したがって、引数を使用せずに組み込み関数を使用している場合でも、彼が説明する2番目または3番目の方法をお勧めします。
少し遅れて実行したいajaxコマンドがいくつかありました。これを行う1つの方法の簡単な例を次に示します。私は、型破りなアプローチのために細断する準備ができています。:)
// Show current seconds and milliseconds
// (I know there are other ways, I was aiming for minimal code
// and fixed width.)
function secs()
{
var s = Date.now() + ""; s = s.substr(s.length - 5);
return s.substr(0, 2) + "." + s.substr(2);
}
// Log we're loading
console.log("Loading: " + secs());
// Create a list of commands to execute
var cmds =
[
function() { console.log("A: " + secs()); },
function() { console.log("B: " + secs()); },
function() { console.log("C: " + secs()); },
function() { console.log("D: " + secs()); },
function() { console.log("E: " + secs()); },
function() { console.log("done: " + secs()); }
];
// Run each command with a second delay in between
var ms = 1000;
cmds.forEach(function(cmd, i)
{
setTimeout(cmd, ms * i);
});
// Log we've loaded (probably logged before first command)
console.log("Loaded: " + secs());
コードブロックをコピーしてコンソールウィンドウに貼り付けると、次のようになります。
Loading: 03.077
Loaded: 03.078
A: 03.079
B: 04.075
C: 05.075
D: 06.075
E: 07.076
done: 08.076
他にも言われているように、setTimeoutが最も安全な方法
ですが、ロジックを新しい関数に分離できない場合は、Date.now()を使用してミリ秒を取得し、遅延を自分で行うことができます。
function delay(milisecondDelay) {
milisecondDelay += Date.now();
while(Date.now() < milisecondDelay){}
}
alert('Ill be back in 5 sec after you click OK....');
delay(5000);
alert('# Im back # date:' +new Date());