generated at
クロージャ

定義時のコンテキスト(スコープチェーン)への参照を持つ関数(つまり外側の関数のローカル変数やグローバル変数)
JavaScriptでは関数を作成すると裏側ではクロージャが作成される
その関数が消失(どこからも参照されなくなる)とクロージャも消失する

ある変数に関数を格納した場合、実際には「関数および関数定義時のコンテキストへの参照をセットにした特殊なオブジェクト」へのリンクが格納される。
この特殊なオブジェクトこそがクロージャの実態。
JavaScriptにおいては、関数を使うこととクロージャを使うことは同義。


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 関数のインスタンスへの参照
ts
myFunc(); console.log(myFunc); // > function displayName() { // alert(name); // }

2. displayName のスコープチェーンは displayName Callオブジェクト makeFunc Callオブジェクト name 変数は makeFunc Callオブジェクトにて解決される。

上記の結果により name 変数が残っていて、 "Mozilla" が alert に渡される。