5

非常に奇妙な振る舞いが起こっています。私は次のJQueryを持っています:

myElement.fadeOut(100);

要素が隠れてしまうことがないように、ある種の競合状態が発生しています。その行にデバッガーを配置してコードをステップ実行すると、正常に動作し、要素がフェードアウトして非表示になります。それをHeisenbugと呼びます。

私の質問は、競合状態自体についてではありません。JavaScriptランタイムの性質を考えると、これがどのように発生する可能性があるのか​​知りたいです。私の理解では、次の述語が当てはまります。

  1. およびfadeOut()は、JQuery animate()によって実装されます。
  2. animate()は、一連のsetTimeout()呼び出しによって実装されます
  3. setTimeout()ある時点でキュー内の関数の実行をスケジュールします
  4. イベントがキューの先頭に到達すると、関数が実行されます。
  5. 順次実行されるイベントループは1つだけです。
  6. 任意の時点で、コールスタックを介した1つの関数/パスのみが実行されています。

デバッガーで関数をステップ実行している場合、実行を一時停止する必要があり、他の関数を実行することはできません。

このような状況で競合状態が発生する可能性があるかどうかはわかりません。デバッグされたコードとデバッグされていないコードで実行がどのように異なる可能性があるかを提案できますか?

4

1 に答える 1

2

ブラウザがサポートしている場合の代わりにrequestAnimationFrame()が使用されることを除いて、箇条書きは正しいです。setTimeout()

myElementたとえば、 AJAX呼び出しによって非同期に作成されたがfadeOut()、要求が完了するのを待たずに呼び出された場合、デバッグセッションはコードの動作に影響を与える可能性があります。

その場合、コードを手動でステップ実行すると、リクエストが返され、前に作成される要素fadeOut()が呼び出されるのに十分な時間が与えられますが、通常の場合、リクエストはまだ返されていません。

于 2012-07-20T14:07:06.000 に答える