1

David Shariff's Blogスコープ チェーン実行コンテキスト スタックの記事を理解しようとして、ここでクロージャーを理解しようとしました。

function foo() {
    var a = 'private variable';
    return function bar() {
        alert(a);
    }
}

var callAlert = foo();
callAlert(); // private variable

内部関数がその親またはスコープチェーン全体から変数オブジェクトを持っているかどうかをテストしたかったので、例を繰り返すネストされた関数を追加しました。

function foo() {
    var a = 'private variable';
    return function bar() {
        return function foobar() {
            console.log(a);
        };
    };
}

var callAlert = foo();
callAlert();  //

そして、それは何の結果ももたらしていません。インタープリターはfoobar()関数に入っていないようです。そして、構文はその親と同じです。

でも、関数の宣言と実行を分けるとうまくいきます。

function foo() {
    var a = 'private variable';
    return function bar() {
        function ra() {
            console.log(a);
        };
        return ra();
    };
}

var callAlert = foo();
callAlert(); // private variable

そして、私はその理由を推測しようとしています。bar()およびfoobar()関数との違いはどこにありますか。

PS - 私はJSFiddleでテストしています

4

1 に答える 1

3
function foo() {
    var a = 'private variable';
    return function bar() {
        return function foobar() {
            console.log(a);
        };
    };
}

ここでは、関数を返す関数を返しているため、その新しい二重にネストされた関数を呼び出す必要があります

var callAlert = foo()();

デモ

またはそのテーマのバリエーション

var getBar = foo();
var getFooBar = getBar();
getFooBar(); //private variable.

更新されたデモ


2 番目の例は、まだ1 つの関数(単純に別の関数を呼び出す関数) を返すため、問題なく動作します。

return function bar() {
    function ra() {
        console.log(a);
    };
    return ra();
};
于 2013-12-10T19:00:10.873 に答える