3

このページhttp://docs.angularjs.org/guide/conceptsの「ランタイム」の説明に次の記述があります。

$evalAsync キューは、現在のスタック フレームの外で発生する必要がある作業をスケジュールするために使用されますが、ブラウザーのビューがレンダリングされる前です。これは通常、setTimeout(0) で行われますが、setTimeout(0) アプローチは速度が遅く、各イベントの後にブラウザーがビューをレンダリングするため、ビューのちらつきが発生する可能性があります。

スタック フレームの外で、ブラウザのビュー レンダーが意味する前に何が起こるか説明できますか?

4

1 に答える 1

2

スタックは、Javascript インタープリターによって実行される関数の順序付きリストと考えることができます。例:

function a () { b();  }
function b () { c(); }
function c () { /* POINT A */ throw new Error('x'); }
a();

ポイント A では、スタックは次のようになります (スローされた例外によって実際に出力されます)。

  1. c
  2. b
  3. a

(一番上にある最新の関数)。

$evalAsync、タスクがスタックの外で呼び出されることを意味します。例えば:

function a () { $evalAsync(b); c(); } 
function b () { c(); }
function c () { /* POINT A */ throw new Error('x'); }
a();

スタックは次のようになります。

  1. c
  2. b

ここにないことに注意してa()ください -b()スタックの外で呼び出されました。実際には、これは次のことを意味します。

  • b()は の前に呼び出されc()ますが、イベントの後に呼び出されます。$evalAsync(b)c()
  • のコール スタックにb()は が含まれませんa()。デバッグがより困難になる可能性があります。
于 2013-08-31T14:51:58.970 に答える