Closer何だ?🤷🏻♂️
7605 ワード
💡 [Core JavaScript-鄭在南とWekibooks]を参照してブログを作成してください.
モジュールは、複数の関数プログラミング言語に現れる一般的な特性です.ECMAScript仕様では、JavaScriptだけでなく、モジュールを個別に定義しません.
情報公開の事前定義
関数-ダグラスパスワードポート、『JavaScriptコアガイド』、韓光メディア 関数は、特定のスキャン-エジンバラ、ランニングマシン、単色メディア にアクセスできるように意図的に定義する.関数を宣言すると、作成された関数は有効範囲が消えた後に呼び出されます.ジョン・ラー式、、フィールド 関数は、ライフサイクル中に終了した外部関数の変数である宋炯柱高賢俊、『InSite JavaScript』、漢光メディア を参照する.の自由変数を持つ関数と既知の自由変数の環境の結合-エリック・フリーマン,『Head First Javascript Programming』,単一メディア ローカル変数を参照する関数-Yamada Yoshiro、JavaScript Master Book、J-Pop は関数-クラスマンホール、<関数型JavaScriptプログラミング>、ウェブサイト です.
MDNさんの説明
の内部関数を外部に伝達する方法は、 エンクロージャの本質は、メモリの使用を継続することであるため、使用されなくなったエンクロージャを管理してメモリの使用を回避する必要がある.
モジュールは、複数の関数プログラミング言語に現れる一般的な特性です.ECMAScript仕様では、JavaScriptだけでなく、モジュールを個別に定義しません.
情報公開の事前定義
さまざまな書籍のモジュールを1つの文章にまとめる📚
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
で指定された親コンテキストouter
のLexicalEnvironment
にアクセスし、a
を検索することができます.outer
関数の実行コンテキストが終了すると、LexicalEnvironment
に格納された識別子(a
、inner
)への参照が削除される.これにより、各アドレスに格納された値には変数が参照されないため、ゴミ収集器の収集オブジェクトになります.
上記の内容を少し変えて、他の例を見てみましょう.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
変数はオブジェクト参照されない.前の例と同様に、a
、inner
変数の値はゴミ収集器の収集対象となる.同様に一般関数や内部関数の動作と区別されない.
の最後の部分
関数を参照して宣言された変数の内部関数を外部に渡すと、関数の実行コンテキストが終了しても変数は消えません.
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
で指定された親コンテキストouter
のLexicalEnvironment
にアクセスし、a
を検索することができます.outer
関数の実行コンテキストが終了すると、LexicalEnvironment
に格納された識別子(a
、inner
)への参照が削除される.これにより、各アドレスに格納された値には変数が参照されないため、ゴミ収集器の収集オブジェクトになります.
上記の内容を少し変えて、他の例を見てみましょう.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
変数はオブジェクト参照されない.前の例と同様に、a
、inner
変数の値はゴミ収集器の収集対象となる.同様に一般関数や内部関数の動作と区別されない.
の最後の部分
関数を参照して宣言された変数の内部関数を外部に渡すと、関数の実行コンテキストが終了しても変数は消えません.
const outer = () => {
let a = 0;
const inner = () => {
console.log(a += 1)
};
inner();
};
outer(); // 1
const outer = () => {
let a = 0;
const inner = () => {
return a += 1
};
return inner();
};
const outer2 = outer();
console.log(outer2); // 1
関数を参照して宣言された変数の内部関数を外部に渡すと、関数の実行コンテキストが終了しても変数は消えません.
return
に関数を伝達するだけでなく、コールバックとして伝達することも含む.Reference
この問題について(Closer何だ?🤷🏻♂️), 我々は、より多くの情報をここで見つけました https://velog.io/@seob/Closure-클로저-너-뭐니テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol