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でテストしています