このコードで:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
私はこの予期しない結果を得ます:
コードを変更すると:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
私は期待される結果を得ます:
また、eval
内部関数内で呼び出しがある場合は、必要に応じて変数にアクセスできます(何に渡すかは関係ありませんeval
)。
一方、Firefox開発ツールは、両方の状況で予想される動作を提供します。
デバッガーがFirefoxよりも便利に動作しないのは、Chromeでどうなっていますか。私はこの動作をしばらくの間、バージョン41.0.2272.43ベータ(64ビット)まで観察しました。
ChromeのJavaScriptエンジンは、可能な場合に関数を「フラット化」するのでしょうか。
私は第二の可変追加すると面白いされ、内側の関数で参照し、x
変数はまだ定義されていません。
対話型デバッガーを使用する場合、スコープと変数の定義に癖があることがよくありますが、言語仕様に基づいて、これらの癖に対する「最善の」解決策があるはずだと私は思います。だから私はこれがFirefoxよりもさらに最適化されているChromeによるものかどうか非常に興味があります。また、これらの最適化は開発中に簡単に無効にできるかどうか(開発ツールが開いているときに無効にする必要があるかもしれませんか?)
また、ブレークポイントとdebugger
ステートメントでこれを再現できます。
debugger;
行が実際には内部から呼び出されていないと言っているようbar
です。デバッガーで一時停止するときにスタックトレースを見てください。bar
関数はスタックトレースで言及されていますか?私が正しい場合は、スタックトレースは、それがライン9で、7行目で、5行目で一時停止しています言うべき
temp1
がコンソールにアタッチされ、これを使用してスコープエントリにアクセスできます。