9

このコードをデバッグしようとすると ( http://jsfiddle.net/QWFGN/ )

var foo = (function(numb) {
    return {
        bar: function() {
            debugger;
            return "something";
        }
    }
})(1);
foo.bar()

Chrome の開発者ツールは、Firefox の Firebug や IE の開発者ツールとは動作が異なります。問題は、行のnumb Chrome 開発者ツールで変数が表示されないことですdebugger;。ただし、Firebug と IE では表示されます。numbChrome のコンソールに入力しようとすると、次のようになります。

ReferenceError: numb is not defined

numb、もちろん、このクロージャーで表示され、コードを ( http://jsfiddle.net/QWFGN/1/ )に変更すると

var foo = (function(numb) {
    return {
        bar: function() {
            debugger;
            console.log(numb);
            return "something";
        }
    }
})(1);
foo.bar()

numbChrome でも表示されるようになり1、レスポンスとして値を取得できます。

だから、私の質問は: Google Chrome だけが使用されていないクロージャー変数を認識しないのはなぜですか? Google Chrome にはガベージ コレクションの独自の実装がありますか、それとも Google Chrome のデバッグ ツールの実装にのみ関連していますか。

4

1 に答える 1

8

これは、ガベージ コレクションやデバッグ ツールとは関係ありません。

実際に起こっていることは、Chrome の JS エンジンはnumb、関数内で決して使用しないことを認識しているため、クロージャーにまったく含まれていないということです。

with内部関数が を使用したり呼び出したりしないことを証明できる場合にのみ、これを行うことができることに注意してくださいeval

于 2013-03-14T13:35:33.717 に答える