JS Closure

1469 ワード

クローズドパッケージ(closure)はjavascriptの重要な概念の一つであり、javascriptに興味がある場合は一度聞くかもしれません.execution contextに関する事前知識があれば、この概念を理解するのは難しくありません.CloserはJavaScript固有の概念ではなく、関数を一次オブジェクトとして扱う関数型プログラミング言語(Functional Programming Language:Elnag,Scala,Haskell,Resp…)で用いられる重要な特性である.
エンクロージャは、周囲のステータス(語彙環境)への参照を含む関数の組合せです.すなわち,クロックは内関数から外関数のスキャンにアクセスできるようにする.JavaScriptでは、関数を作成するたびにモジュールが作成されます.
簡単に言えば、関数が宣言されたとき(Xを実行する)外部のlexocial環境を参照しますか?できる現象は?はい.

例)


関数の実行コンテキストを簡単に理解する必要があります.
関数は呼び出し時に関数の実行コンテキストを生成し、実行終了時に実行コンテキストを終了します.(フォースの実行コンテキストを作成すると、関数の語彙環境も作成されます.)
この実行コンテキストの語彙環境には、関数の領域変数の情報&関数の親スキャンの情報が含まれます.
function outer(){
  const name = 'kyle';
  console.log(name)
}
sayName() //kyle
console.log(name) //error
上のコードの結果はどう見ても当然です.ここで、関数の外で変数nameを使用したい場合は、どのように使用しますか?
outerという関数の実行コンテキストが終了すると、変数nameには誰もアクセスできません.関数の外でnameを使用するにはcloserを使用します.
function outer(){
  const name = 'kyle';
  console.log(name)
  return function inner(){
    const greeting = 'hello!'
    console.log(greeting,name)
  }
}
const getKyle = outer() //kyle 
getKyle() //hello!kyle
outer関数は上記のように終了します.
予想通り、うーん~outer関数が終わり、nameはどこにもアクセスできません!
ただし、内部関数からアクセスできます.
どうしたんですか.どうして可能なの?これがCloserです.
したがって,内部で実行されても語彙環境を作成した後は参照せず,宣言時に縛られる.
->変数名を使用可能にします.

なぜロッカーが必要ですか?


1.グローバル変数を減らすことができます.
2.類似形式のコードの再利用率を向上させることができる.