キャビネット(closure)


キャビネット(closure)


Closerとは?
1.関数と宣言された関数の語彙環境の組み合わせ
2.戻り関数
3.外部関数変数にアクセスできる内部関数
->
関数のコールバック関数として,外部関数の変数にアクセスできる内部関数をcloserと呼ぶ.

Closerの特徴について

  • フィーチャー1.
    戻り関数
  • ここに加算をする関数があります.

    この関数を少し違うように実装してみましょう.

    最初のコードとは異なり、上のコード
    関数の호출(invacation)が2回発生します.

    説明:

    const add = (a) => (b) => a + b;
    add(5)(10) // --> 15
    add(5) // --> (b) => a + b; 형태의 함수// 그럼 add(5)를 호출함으로써 매개변수 a에 들어간 5는 어디로 갔나? -> 메모리상에 저장되어있다. 즉 add(5)는 메모리상에 매개변수 a에 5를 저장해둔 (b) => a + b; 라는 함수! 이다.
    typeof add(5) // --> 'function'
    typeof add(5)(10) // --> 'number'
    前に述べたように
    add(5)は関数です.
    aに5の(b)=>a+bを指定します.因関数です.
    メモリに格納されているため、aという変数をグローバルに出力しようとしてもエラーが発生します.
    ->

    上記では、矢印関数によって記述された함수 표현식(익명함수)を表すために、functionキーワードが使用される.
    클로저 함수は上と同じ함수를 리턴하는 함수なので、そのような形態を持っています.
    次のコードは上の形式のように함수를 리턴하는 함수ですが、モジュールの関数ではありません.
  • フィーチャー2.
    外部関数変数にアクセス可能な内部関数
  • エンクロージャは、返される関数によってスキャン(変数のアクセス範囲)を区別します.
    モジュールの核心は、スキャンを利用して変数のアクセス範囲(closure;closure)を閉じることである.
    したがって,宣言変数の位置は戻り関数の位置と同様に重要である.


    上記のコードから,変数aとbが宣言する箇所はそれぞれ異なる.
    a宣言された関数は外にあり、외부 함수と呼ばれ、aは외부함수의 변수と呼ばれている.
    b宣言の関数は외부함수の中にあり、내부 함수と呼ばれ、bは내부함수의 변수と呼ばれています.
    このように,Closer関数の走査線は分離されている.

    上記のモジュール関数に基づいてスキャンルールを追加


    ->
    外部関数は変数bにアクセスできません
    内部関数は変数aにアクセスできます

    エンクロージャの使用方法について


    エンクロージャの使用方法について説明します.
    一般関数は、関数の実行が終了した後、関数内部の変数を使用できません.
    ただし、モジュールは、外部関数の実行が完了しても、外部関数の変数をメモリに格納します.
    (語彙環境をメモリに格納するため、起こり得ること)
    コードで理解しよう

    上のコードに示すように.
    変数addTenは、エンクロージャを介して返される関数を含む.addTe nは、add함수から변수 aに因子として伝達される10という値であり、a = 10のように含まれ続けている.
    外部関数がすでに実行されていても!
    (データ保持関数)
    const add = function (a) {
        return function (b) {
          return a + b;
        };
      };
    
      const addTen = add(10);
    
      console.log(addTen); 
    // --> f (b) {return a + b;} 
    // addTen은 f (b) {return a + b;} 함수이면서 동시에 메모리상에 a변수에 10을 가지고 있는 녀석이다! 라고 생각하면 된다.
    したがって、addTen(10)の場合、-->15が表示されます.

    これはメモリに格納されており、外部からaにアクセスしようとするとエラーが発生します.

    関数の再利用(モジュール化)、使用例

  • HTMLタグ生成コード

  • これにより、エンクロージャは特定のデータをスキャナに保存して使用を継続することができます.
  • エンクロージャモジュールモード
  • モジュールを使用してオブジェクトに内部関数を配置し、複数の内部関数を返します.

    上のコードを再使用します.
    makeCount()関数を持つ2つの変数を宣言します.
    const count1 = makeCount();
    const count2 = makeCount();
    これらは同じ関数を持つが、makeCount()を実行するときに宣言されるlet a=0である.の値はそれぞれ独立しています.
    したがって、count 1およびcount 2のaは互いに独立し、それぞれの値を保持することができる.

    このように、関数の再利用性を最大限に高め、1つの関数を完全に独立した形式に分離することを모듈화と呼ぶ.