クロージャ
定義時のコンテキスト(スコープチェーン)への参照を持つ関数(つまり外側の関数のローカル変数やグローバル変数)
JavaScriptでは関数を作成すると裏側ではクロージャが作成される
その関数が消失(どこからも参照されなくなる)とクロージャも消失する
ある変数に関数を格納した場合、実際には「関数および関数定義時のコンテキストへの参照をセットにした特殊なオブジェクト」へのリンクが格納される。
この特殊なオブジェクトこそがクロージャの実態。
JavaScriptにおいては、関数を使うこととクロージャを使うことは同義。
code:ts
function makeFunc() {
var name = 'Mozilla';
function displayName() {
alert(name);
}
return displayName; // 内部関数 displayName() がそれが実行される前に外側の関数(makeFunc)から返されている
}
var myFunc = makeFunc(); // makeFuncが実行された時に作られたdisplayName関数のインスタンスへの参照
myFunc(); // => alert(name)が実行される
クロージャ=関数とその関数が作られた環境という2つのものの組み合わせ
1. myFuncが実行される -> makeFuncが実行された時に作られたdisplayName関数のインスタンスへの参照
code:ts
myFunc();
console.log(myFunc);
// > function displayName() {
// alert(name);
// }
上記の結果によりname変数が残っていて、 "Mozilla" が alert に渡される。