2011-11-08 30 views
11

javascriptでスタックオーバーフローを回避するには、setTimeoutメソッドを使用して関数を直接呼び出すのではなく呼び出すことができますか? setTimeoutを理解すると、新しい呼び出しスタックを開始する必要があります。クロムとIEの呼び出しスタックを見ると、setTimeout呼び出しが関数呼び出しが戻るのを待っているようです。setTimeoutを呼び出すと、呼び出しスタックがクリアされますか?

これはデバッガの単なるプロパティですか、または私の理解に欠陥がありますか?

EDIT

以下に提供回答が正解であるが、私が持っていた実際の問題は、私が原因のすぐaFunctionを評価したsetTimeout(aFunction()、10)を呼び出したという事実に関連していました角かっこ。 This questionは私を並べ替えました。

+0

機能がsetTimeout'が返さ'呼び出される関数の前に呼び出すことはできません。そう、はい、その関数は新しいコールスタックを開始します。 –

答えて

12

スタックがクリアされたことを確認できます。

は、このシナリオを考えてみましょう:

function a() { 
    b(); 
} 

function b() { 
    c(); 
} 

function c() { 
    debugger; 
    setTimeout(d, 1000); 
} 

function d() { 
    debugger; 
} 

a(); 

だから2つのブレークポイントがある - 機能cの先頭に1、および機能dの先頭に一つは。

  • C()
  • B()
  • 第ブレークポイント()

スタック:最初のブレークポイントで

スタック

  • D()

ライブデモ:setTimeout` `に渡さhttp://jsfiddle.net/nbf4n/1/

+0

私は正しい方向に私を指してくれてありがとう、私はあなたの答えに基づいて解決することができたが、私は別の質問を参照してくださいhttp://stackoverflow.com/questions/8058996/why-does-calling-settimeout-with-parenthesis-新しいスタートアップではありません –

+0

もしこの人が正しいのであれば、あなたの答えは正しい答えでしょうか?この男は常にコールバックをコールバック・キューにプッシュすると言っているので、スタックではなく、コール・スタックで同期コマンドが実行されている場合、またはスタック内の他のものが指定されたミリ秒。それでは必ずしも1対1ではありません。これは起こる可能性がありますねえ、私は5秒の遅れをあなたに伝えました、なぜあなたは7に戻りますか?コールバックはもう少し待たなければならなかったからです。 https://youtu.be/8aGhZQkoFbQ?t=782 – PositiveGuy

+0

'setTimeout'の第2引数で指定した遅延は、コールバックがその特定の時点で呼び出されることを保証しません。私の答えはそれがそうであるとは言いません。 –

4

setTimeoutなどの非同期呼び出しは、実際には新しい呼び出しスタックを生成します。

「クロムとIEの呼び出しスタックを見ると、setTimeout呼び出しが関数呼び出しが戻るのを待っているようです。しかし、あなたができることの1つは、setTimeoutによって呼び出される関数の中にブレークポイントを置き、コールスタックが空であることを確認することです。

+0

なぜデバッガでコールスタック全体がまだ見えるのか分かりますか?それは、setTimeoutからの関数呼び出しが特定のローカル変数を取得するためにクロージャを使用するためですか? –

+1

@AranMulhollandデバッガをどこで呼び出すのですか? 'setTimeout'に渡される関数の中に? –

+0

@ imeVidas質問によると、私はちょうどブラウザのデバッガ(ChromeとIE)の呼び出しスタックを見ています –

関連する問題