Javascript Closure


1.コピー(エンクロージャ)

클로저とは、내부함수외부함수に近づくことができるコンテキストを指す.
ここでcontextは韓国語で直訳すると「文脈」を意味し、コードの실행 환경と簡単に理解される.클로저とは、내부함수외부함수に近づくことができる실행 환경を意味する.

2.モジュールの理解


まず、このモジュールを理解して使用するには、전역변수および지역변수scopelexical scoping(렉시컬 스코핑)を理解する必要があります.
必要:Scope

2-1. グローバル変数


グローバル変数が構成部品またはページ内にある場合
これは、スクリプト領域の任意の場所で使用できる変数を意味します.

2-2. ゾーン変数


領域変数は、関数で定義された変数です.
この関数でのみ使用される変数を表します.
一般に、変数は、ブロック{}内または関数内で近似することができる.

2-3. 語彙範囲チェック


もしあなたがスコフについて一定の理解があれば、必ずいくつかのことを知っていなければなりません.
スキャンは、関数を呼び出すときに発生するのではなく、宣言時に発生することを知っておく必要があります.
これは静的パースビューとも呼ばれる.
次のコードの結果を推定します.
let name = 'kingmo'
function log() {
	console.log(name)
}

function wrapper() {
	name = 'haha'
  	log()
}
wrapper()
wrapper()が呼び出されると、コンソールには「haha」が表示されます.
これは簡単なので、呼び出す前にnameを「haha」に変更します.
では、次のコードを見てみましょう.
let name = 'kingmo'
function log() {
	console.log(name)
}

function wrapper() {
	let name = 'haha'
    log()
}
wrapper()
ここで、wrapper()のコール結果はどうなりますか?
同じ「ハハ」が出てくるのでしょうか?
いいえ、コンソールに「kingmo」が写っています.
これは関数を宣言するときに発生するためです.log()関数のnameは、wrapper()の領域変数nameではありません.
グローバル変数nameを指します.
これはlexical scoping(렉시컬 스코핑)と呼ばれています.
もう少し簡単に説明しましょう.
初めて関数を宣言したときの関数内部の変数스코프 체인におけるミラーに最も近い位相範囲の変数を参照する.
したがって、log()関数のname変数は宣言時に
最近のグローバル変数nameを参照してください.wrapper()関数でlogが呼び出されても
参照地域変数name = 'haha'ではありません.
参照グローバル変数name = 'kingmo'.

2-4. モジュールモード


JavaScriptコードを使用してコラボレーションを行う場合は、グローバル変数の作成は避けてください.
これは、変数が混在し、偶然同じ変数名が使用される可能性があるためです.
既存の変数を覆う不吉なことが起こるからだ.
ES 6では、varではなくletconstとして変数が宣言される.
上記の理由で.
ここでは最初から変数を関数に宣言し、
この関数を呼び出す前に、宣言がないことを確認してください.
変数を비공개に設定する方法もあります.
次のコードで、
let another = function () {
  let x = 'local';
  function y() {
    alert(x);
  }
  return { y: y };
}
let newScope = another();
newScopeは、宣言と同時のanotherの戻り値として割り当てられる.
ここで返される値は{ y: function() { alert('local') } }です.newScopeという名前のネーミングスペース(変数名)を介して
変数yにアクセスできますが、変数xにアクセスできません.
ここでyは공개변수 x,비공개 변수と見なすことができる.
他の言語とは異なり、JavaScriptでは、
非公開関数に特化した構文、例えばprivateおよびprotectedがないためである.
上記の方法で비공개 변수機能を作成して使用できます.
このパターンは모듈 패턴とも呼ばれる.
次のコードで、
function aaa() {
	let apple = "이건 사과에요"
    
    return function bbb() {
    	let banana = "이건 바나나에요"
        console.log("안녕하세요")
      	console.log(apple)
      	console.log(banana)
    }
}

呼び出しaaa()関数は、bbb()関数を返します.
ここからaaa()()からbbb()の関数を一度に返すことができます.console.log(apple)に注目します.
ここで、変数applebbb()関数の内部に作成された変数ではない.aaa()関数のパラメータでもありません.
このようなappleのような変数は、上述した비공개 변수である.
上のようなドアは클로저です.
内部関数bbb()が外部関数aaa()環境にアクセスし、이건 사과에요という名前のコンソールを出力することがわかる.클로저비공개 변수からなるからです.
ユーザー・アクセスの防止、たとえば
予想外の行動を防ぐことができます.
したがって,エンクロージャはJavaScriptでユーザを制御する基本手法である.
参照1
参照。