Closer何だ?🤷🏻‍♂️


💡 [Core JavaScript-鄭在南とWekibooks]を参照してブログを作成してください.
モジュールは、複数の関数プログラミング言語に現れる一般的な特性です.ECMAScript仕様では、JavaScriptだけでなく、モジュールを個別に定義しません.

情報公開の事前定義



さまざまな書籍のモジュールを1つの文章にまとめる📚

  • 関数-ダグラスパスワードポート、『JavaScriptコアガイド』、韓光メディア
  • 関数は、特定のスキャン-エジンバラ、ランニングマシン、単色メディア
  • にアクセスできるように意図的に定義する.
  • 関数を宣言すると、作成された関数は有効範囲が消えた後に呼び出されます.ジョン・ラー式、、フィールド
  • 関数は、ライフサイクル中に終了した外部関数の変数である宋炯柱高賢俊、『InSite JavaScript』、漢光メディア
  • を参照する.
  • の自由変数を持つ関数と既知の自由変数の環境の結合-エリック・フリーマン,『Head First Javascript Programming』,単一メディア
  • ローカル変数を参照する関数-Yamada Yoshiro、JavaScript Master Book、J-Pop
  • は関数-クラスマンホール、<関数型JavaScriptプログラミング>、ウェブサイト
  • です.

    MDNさんの説明


    MDNはモジュールについて以下のように説明した.
    A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). In other words, a closure gives you access to an outer function’s scope from an inner function. In JavaScript, closures are created every time a function is created, at function creation time.
    Closerは、関数と関数宣言時の語彙環境の組合せです.すなわち、モジュールは、内部関数が外部関数のスキャンにアクセスできることを意味する.JavaScriptで関数を作成するたびに、関数の作成時にモジュールが作成されます.モジュールを理解するには、まずJavaScriptが変数の有効範囲をどのように指定するかを理解する必要があります.

    まず目で見て理解してください。👀

    function outer(x) {
      return function inner() {
        return x;
      }
    }
    
    const two = outer(2);
    console.log(two()) // 2
    outer関数にはinner関数があります.inner関数は、outer関数のパラメータであるxを返します.outer関数が呼び出されると、outerのライフサイクルが終了します.ただし、inner関数はxを参照する.
    上記のコード例に示すように、外部スキャンを「クローズ」(Closer)と呼ぶことを覚えておいてください.

    あなたが理解しなくても大丈夫なジョー・キングのバージョン💆🏻‍♂️

    const outer = () => {
      let a = 0;
      const inner = () => {
        console.log(a += 1)
      };
      inner();
    };
    outer(); // 1
    outer関数内で変数aを宣言し、outer関数内でinner関数中のaの値を1増加させて出力する.inner関数の内部にはaが宣言されていないため、environmentRecordで値が見つからないため、outerEnvironmentReferenceで指定された親コンテキストouterLexicalEnvironmentにアクセスし、aを検索することができます.outer関数の実行コンテキストが終了すると、LexicalEnvironmentに格納された識別子(ainner)への参照が削除される.これにより、各アドレスに格納された値には変数が参照されないため、ゴミ収集器の収集オブジェクトになります.
    上記の内容を少し変えて、他の例を見てみましょう.
    const outer = () => {
      let a = 0;
      const inner = () => {
        return a += 1
      };
      return inner();
    };
    const outer2 = outer();
    console.log(outer2); // 1

    今回もinner関数内部に外部変数aを用いた.ただし、6行目でinner関数を実行した結果が返されるため、outer関数の実行コンテキストが終了すると、a変数はオブジェクト参照されない.前の例と同様に、ainner変数の値はゴミ収集器の収集対象となる.同様に一般関数や内部関数の動作と区別されない.

    の最後の部分


    関数を参照して宣言された変数の内部関数を外部に渡すと、関数の実行コンテキストが終了しても変数は消えません.
  • の内部関数を外部に伝達する方法は、returnに関数を伝達するだけでなく、コールバックとして伝達することも含む.
  • エンクロージャの本質は、メモリの使用を継続することであるため、使用されなくなったエンクロージャを管理してメモリの使用を回避する必要がある.