17

ある時点で、ページを更新するときに「console」変数が null になる大規模な JavaScript コード ベースをデバッグしています。

コンソールにウォッチを設定し、その値が変更されたとき (または条件(console == null)が真のとき) に JavaScript の実行を中断させる方法はありますか?

Windows 7 で Chrome を使用しています。

4

3 に答える 3

22

以下の答えは、 (他のブラウザネイティブの環境変数と同様に)特別に扱われるwindow.consoleため、機能しません。console値を割り当てようとするとconsole、元の値が「隠蔽」されるだけです。それを置き換えるものではありません。値がいつconsole変化したかを検出することはできませんが、delete window.console環境によって提供された元の値を復元することはできます。

その他の値についてはObject.defineProperty、一部の global のカスタム セッターを定義するために使用しますwindow.foobarwindow.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を持つオブジェクトに変更するだけです)。

于 2012-11-08T15:20:22.757 に答える
0

ブラウザで実装された関数をnullにすることはできません!技術的に言えば。

window.console.log関数が割り当てられている場合はnull、それを復元して削除します。

delete console.log

それは仕事をします:)

編集:それはあなたの主な質問への答えではありませんが、あなたの質問はデバッグの方法を探しているあなたから来ていると思います、それでこの答えは基本的に変数の変更を検出する必要性をスキップします。

于 2012-11-08T15:18:22.240 に答える
0

オブジェクトに触れることはできませんconsole...決して、決して。起こりうる唯一のことはconsole、グローバル スコープ以外のスコープ/名前空間で変数が宣言され、グローバル コンソールが隠されることです。ただし、を使用してアクセスすることはできwindow.consoleます。それ以外に、これを引き起こすと私が考えることができる唯一のことは次のとおりです。

  • サポートされていないバージョンの IE をエミュレートするために、コンソールのオーバーライドでユーザー エージェントを設定しました。console
  • コードに他の問題があるため、コードはエラーをスローしています
  • @alexandernst が指摘したように、コンソール オブジェクトのプロパティをオーバーライドしています。アクセスできないメソッドを削除すれば問題ありません

コードセットの条件付きブレークポイントを調べる必要がある場所を見つけて、いくつかの式を監視し、キャッチされていない例外で一時停止ボタンを使用します

于 2012-11-08T15:20:20.327 に答える