blog

Js クロージャ

クロージャは、関数が現在のレキシカルスコープ外で実行されたとしても、関数がそのレキシカルスコープを記憶してアクセスするときに作成されます。 簡単に言うと、クロージャとは、そのレキシカル・スコープ内の変...

Sep 22, 2020 · 2 min. read
シェア

クロージャの定義

クロージャは、その関数が現在のレキシカル・スコープの外で実行されても、その関数が置かれているレキシカル・スコープを記憶してアクセスできるときに作成されます。

もっと率直に言うと、クロージャとは、そのレキシカル・スコープで変数にアクセスできる関数のことです。

コードスニペットによる理解

function foo(){ var a=3; function bar(){ console.log(a); } return bar; } const a=foo() a()

実行後のfoo関数の戻り値は、変数aに渡され呼び出されたbar関数です。参照型の性質から、barとaは同じ関数を参照しています。つまり、bar関数は自身のレキシカル・スコープの外で実行されます。

通常、関数が実行されると、jsエンジンのゴミ処理メカニズムにより、その内部スコープ全体が破棄されます。しかし、ここではfoo関数は明らかにゴミ箱に捨てられていません。

クロージャの主な機能はここにあり、バー関数はまだこのスコープのブロックを参照しなければならないからです。つまり、消えてしまったはずのこのスコープのブロックが保存されるのです。

クロージャの役割

  1. 関数内で変数を読み込むことができます。
  2. これらの変数の値は、常にメモリーに残しておきます。

クロージャの利点と欠点

バンテージ

  • いくつかのレキシカルスコープがリサイクルされるのを防ぎ、いくつかの有用な情報を保存し、ブロックレベルのスコープをシミュレートします。

欠点

  • クロージャの利点は欠点でもあります。そのため、クロージャが多すぎるとメモリリークにつながる可能性があります。

閉鎖に関するよくある質問

for (var i = 0; i < 5; i++) {
 setTimeout(function() {
 console.log(i);
 }, 1000);
}

2.コールバック関数はクロージャですか?クロージャはコールバック関数を呼び出すことができますか?

知らないと損するJavaScript」に見るスコープとクロージャ - ベスト・オブ・ベスト

クロージャの深層

50行でわかるMVVM、クロージャの極意

JavaScriptのクロージャをより深く理解するために、クロージャとは何か?

シナリオの使用に関するJavaScriptクロージャークロージャーの深い理解

JavaScriptにおける静的スコープ連鎖と "動的 "クロージャ連鎖

Read next

Jsのスコープとスコープチェーン

スコープの分類 1、語彙的スコープ/静的スコープ:js使用 2、動的スコープ:bash使用 スコープの連鎖 変数を探す場合、まず現在のコンテキストから変数オブジェクトを探し、見つからなければ変数の親コンテキストから実行します。

Sep 22, 2020 · 2 min read