非常に奇妙な振る舞いが起こっています。私は次のJQueryを持っています:
myElement.fadeOut(100);
要素が隠れてしまうことがないように、ある種の競合状態が発生しています。その行にデバッガーを配置してコードをステップ実行すると、正常に動作し、要素がフェードアウトして非表示になります。それをHeisenbugと呼びます。
私の質問は、競合状態自体についてではありません。JavaScriptランタイムの性質を考えると、これがどのように発生する可能性があるのか知りたいです。私の理解では、次の述語が当てはまります。
- およびfadeOut()は、JQuery animate()によって実装されます。
- animate()は、一連の
setTimeout()
呼び出しによって実装されます setTimeout()
ある時点でキュー内の関数の実行をスケジュールします- イベントがキューの先頭に到達すると、関数が実行されます。
- 順次実行されるイベントループは1つだけです。
- 任意の時点で、コールスタックを介した1つの関数/パスのみが実行されています。
デバッガーで関数をステップ実行している場合、実行を一時停止する必要があり、他の関数を実行することはできません。
このような状況で競合状態が発生する可能性があるかどうかはわかりません。デバッグされたコードとデバッグされていないコードで実行がどのように異なる可能性があるかを提案できますか?