今日Firefoxでクライアント側のJavaScriptをデバッグしているときに、かなり奇妙で少し不安なことに遭遇しました。また、IE / VS2010で同じスクリプトをデバッグしているときに、この動作を再現できませんでした。
私が見ている異常を説明するために、簡単なサンプルhtmlドキュメントを作成しました。
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js" type="text/javascript" ></script>
</head>
<body id="main_body">
<script type="text/javascript">
$(function () {
$(".test-trigger").on("click", function () {
loadStuff();
console && console.log && console.log("this will probably happen first.");
});
});
function loadStuff() {
$.get("http://google.com/")
.fail(function () {
console && console.log && console.log("this will probably happen second.");
});
}
</script>
<button class="test-trigger">test</button>
</body>
</html>
このドキュメントをFirefoxにロードし(Windows 7のFirebugバージョン1.10.1でバージョン13.0を使用しています)、[テスト]をクリックし、Firebugのコンソールタブを表示すると、getリクエストが失敗することに気付くはずです(クロスドメイン違反は何もありません私がここで作ろうとしているポイントを使ってください)、そうすれば、おそらく次のようになります:
this will probably happen first.
this will probably happen second.
次に、13行目と20行目にブレークポイントを設定します。
13: console && console.log && console.log("this will probably happen first.");
20: console && console.log && console.log("this will probably happen second.");
もう一度[テスト]をクリックすると、期待どおりに13行目で中断します。ここで、実行を再開します。あなたの経験が私のようなものであれば、20行目で中断することはありません。また、コンソールタブに切り替えると、次の一連のログ出力が表示されます。
this will probably happen second.
this will probably happen first.
私にとって、これはajaxリクエストの失敗ハンドラーがクリックハンドラーが実行されているスレッド以外のスレッドで実行されていることを示唆しています。私は常に、単一ページのすべてのJavaScriptがによって実行されると信じるように導かれてきました任意のブラウザの単一スレッド。私はここで本当に明白な何かを逃していますか?この観察についての洞察に感謝します。
ああ、Visual Studioを使用してIEで実行されている同じページをデバッグすると、予想どおりに両方のブレークポイントがヒットします。