ある時点で、ページを更新するときに「console」変数が null になる大規模な JavaScript コード ベースをデバッグしています。
コンソールにウォッチを設定し、その値が変更されたとき (または条件(console == null)
が真のとき) に JavaScript の実行を中断させる方法はありますか?
Windows 7 で Chrome を使用しています。
ある時点で、ページを更新するときに「console」変数が null になる大規模な JavaScript コード ベースをデバッグしています。
コンソールにウォッチを設定し、その値が変更されたとき (または条件(console == null)
が真のとき) に JavaScript の実行を中断させる方法はありますか?
Windows 7 で Chrome を使用しています。
以下の答えは、 (他のブラウザネイティブの環境変数と同様に)特別に扱われるwindow.console
ため、機能しません。console
値を割り当てようとするとconsole
、元の値が「隠蔽」されるだけです。それを置き換えるものではありません。値がいつconsole
変化したかを検出することはできませんが、delete window.console
環境によって提供された元の値を復元することはできます。
その他の値についてはObject.defineProperty
、一部の global のカスタム セッターを定義するために使用しますwindow.foobar
。window.foobar
セッター関数は、新しい値が割り当てられるたびに実行されます。
(function() {
var actualFoobar = window.foobar;
Object.defineProperty(window, "foobar", {
set: function(newValue) {
if(newValue === null) {
alert("someone is clobbering foobar!"); // <-- breakpoint here!
}
// comment out to disallow setting window.foobar
actualFoobar = newValue;
},
get: function() { return actualFoobar; }
});
})();
次に、そのセッター関数にブレークポイントを置きます。
このアプローチは、グローバル変数または任意のオブジェクト プロパティに対して機能します (プロパティwindow
を持つオブジェクトに変更するだけです)。
ブラウザで実装された関数をnullにすることはできません!技術的に言えば。
window.console.log
関数が割り当てられている場合はnull
、それを復元して削除します。
delete console.log
それは仕事をします:)
編集:それはあなたの主な質問への答えではありませんが、あなたの質問はデバッグの方法を探しているあなたから来ていると思います、それでこの答えは基本的に変数の変更を検出する必要性をスキップします。
オブジェクトに触れることはできませんconsole
...決して、決して。起こりうる唯一のことはconsole
、グローバル スコープ以外のスコープ/名前空間で変数が宣言され、グローバル コンソールが隠されることです。ただし、を使用してアクセスすることはできwindow.console
ます。それ以外に、これを引き起こすと私が考えることができる唯一のことは次のとおりです。
console
コードセットの条件付きブレークポイントを調べる必要がある場所を見つけて、いくつかの式を監視し、キャッチされていない例外で一時停止ボタンを使用します