クロージャの定義
クロージャは、その関数が現在のレキシカル・スコープの外で実行されても、その関数が置かれているレキシカル・スコープを記憶してアクセスできるときに作成されます。
もっと率直に言うと、クロージャとは、そのレキシカル・スコープで変数にアクセスできる関数のことです。
コードスニペットによる理解
function foo(){
var a=3;
function bar(){
console.log(a);
}
return bar;
}
const a=foo()
a()
実行後のfoo関数の戻り値は、変数aに渡され呼び出されたbar関数です。参照型の性質から、barとaは同じ関数を参照しています。つまり、bar関数は自身のレキシカル・スコープの外で実行されます。
通常、関数が実行されると、jsエンジンのゴミ処理メカニズムにより、その内部スコープ全体が破棄されます。しかし、ここではfoo関数は明らかにゴミ箱に捨てられていません。
クロージャの主な機能はここにあり、バー関数はまだこのスコープのブロックを参照しなければならないからです。つまり、消えてしまったはずのこのスコープのブロックが保存されるのです。
クロージャの役割
- 関数内で変数を読み込むことができます。
- これらの変数の値は、常にメモリーに残しておきます。
クロージャの利点と欠点
バンテージ
- いくつかのレキシカルスコープがリサイクルされるのを防ぎ、いくつかの有用な情報を保存し、ブロックレベルのスコープをシミュレートします。
欠点
- クロージャの利点は欠点でもあります。そのため、クロージャが多すぎるとメモリリークにつながる可能性があります。
閉鎖に関するよくある質問
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
2.コールバック関数はクロージャですか?クロージャはコールバック関数を呼び出すことができますか?
知らないと損するJavaScript」に見るスコープとクロージャ - ベスト・オブ・ベスト
50行でわかるMVVM、クロージャの極意
JavaScriptのクロージャをより深く理解するために、クロージャとは何か?
シナリオの使用に関するJavaScriptクロージャークロージャーの深い理解
JavaScriptにおける静的スコープ連鎖と "動的 "クロージャ連鎖