ホームページ  >  記事  >  ウェブフロントエンド  >  JS クロージャの簡単な理解

JS クロージャの簡単な理解

一个新手
一个新手オリジナル
2017-10-10 10:09:461555ブラウズ

クロージャーの定義:

クロージャーとは、別の関数のスコープ内の変数にアクセスできる関数を指します。

ここでは別の定義が使用されています:

クロージャは、関数が定義されたときに字句スコープ外で呼び出された場合でも、関数がその字句スコープを記憶してアクセスできるときに発生します。

最初のポイント: JavaScript は

字句スコープ に基づいています。字句スコープとは、コードを記述するときに関数宣言の位置によってスコープが決定されることを意味します。 字句スコープ検索ルール: 最初に一致する識別子が見つかったときにスコープ検索が停止します。同じ名前の識別子は、ネストされたスコープの複数のレベルで定義できます。これは、「シャドウイング効果」と呼ばれます (内部識別子が外部識別子を「シャドウ」します)。シャドウイング効果に関係なく、スコープ検索は常にランタイムが配置されている最も内側のスコープから開始され、最初に一致する識別子が見つかるまで外側または上方向に進みます。

関数がどこで呼び出されるか、どのように呼び出されるかに関係なく、その字句範囲は関数が宣言された位置によってのみ決定されます。 2 番目のポイント: JavaScript には関数ベースのスコープがあり、関数は JavaScript で最も一般的なスコープ単位です。
関数スコープ は、この関数に属するすべての変数が関数全体のスコープ内で使用および再利用できることを意味し (実際、入れ子になったスコープでも使用できます)、外側のスコープは内部のラッパー関数 Anything にアクセスできません。 3 番目のポイント: JavaScript の関数は第一級オブジェクトです
1) 変数、配列要素、その他のオブジェクトに割り当てることができるプロパティ
2) パラメータとして関数に渡すことができます
3) 関数の戻り値として使用できます
4 番目のポイント: クロージャ

function foo() {
    var a = 2;    
    function bar() {
        console.log( a ); // 2。bar()对 a 的引用的方法是词法作用域的查找规则,而这些规则只是闭包的一部分
    }
    bar();
}
foo();

上記のコードは実際にはクロージャを使用しません。クロージャの適用は、一般に 2 つの状況に分けられます - 戻り値として関数を使用する場合と、戻り値として関数を使用する場合です。パラメーター。

上記のコードを書き換えます:

function foo() {
    var a = 2;    
    function bar() {
    console.log( a );
    }    return bar;//函数作为返回值}var baz = foo();
baz(); // 2 —— 朋友,这就是闭包的效果。

ここで、関数 bar() の字句スコープは foo() の内部スコープにアクセスできます。次に、bar() 関数自体を値の型として渡します。この例では、bar 自体によって参照される関数オブジェクトを戻り値として使用します。

この例では、bar() は定義された字句範囲外で実行されます。 foo() 関数が戻った後も、その内部スコープは依然として存在し、bar() はスコープへの参照を保持しており、この参照はクロージャと呼ばれます。
関数をパラメータとして渡す別の例を書きます:

var max = 10,
fn = function(x) {
    if (x > max) {//注意词法作用域规则,这里的max是10,而不是100.
        console.log(x);  //15
    }
};
(function(f) {
    var max = 100;
    f(15);
})(fn);

5 番目のポイント: JavaScript のガベージ コレクション メカニズム GC

js では、オブジェクトが参照されなくなった場合、そのオブジェクトは GC によってリサイクルされ、それ以外の場合はオブジェクトがリサイクルされます。 will 常にメモリに保存されます

ポイント 6: 実行環境、アクティブオブジェクト、スコープとスコープチェーン

実行環境内のすべてのコードが実行された後、環境は破棄され、環境に保存されているすべての変数と関数も破棄されます。

関数が呼び出されると、実行環境と対応するスコープ チェーンが作成され、引数やその他の名前付きパラメーターの値を使用してアクティブ オブジェクトが初期化されます。

ただし、場合によっては、関数呼び出しが完了した後、その実行環境のスコープ チェーンは破棄されますが、アクティブなオブジェクトはメモリ内に残ったままになります。これは、クロージャについて理解する必要があることの中核です。

以上がJS クロージャの簡単な理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。