3

デバッグ中、無名関数の場合、クロージャーはどこにありますか?

非匿名関数の場合、「機能範囲」に表示されるようです。例:

    function outer(x){
    var temp = 0;
    return function inner(){
        alert(++x);
    };
    }
    var out = outer(3);
    out();
    debugger;
    out = outer(5);
    out();

この場合、"out" のウォッチ式にClosure_in_functionalscopeが表示されます。

ただし、以下に示すように匿名関数を使用すると:

    function outer(x){
    var temp = 0;
    return function (){
        alert(++x);
    };
    }
    outer(3)();
    debugger;
    outer(5)();

この場合、無名関数がウォッチ式のクロージャーとして表示されません。無名関数の場合、どのオブジェクトがクロージャを格納しますか?

4

1 に答える 1

3

内部関数に名前が付けられているかどうかとは関係ありません。

out最初のスクリーンショットでは、返された関数を参照する変数を調べていますが、 outer. その関数はxそのクロージャースコープにあります。

outer2 番目のスクリーンショットでは、名前付きグローバル関数を参照する変数を調べています。そのコード スニペットには、結果またはouter(3). 最初の例と同じようにそれを変数に代入しvar out = outer(3)、その代入の後にブレークポイントを置くと、outのクロージャー スコープが表示されます。outer(3)または、コードを変更せずに、デバッガーに「ウォッチ式」を追加することで、それを調べることができます。

于 2013-01-23T22:53:29.433 に答える