JavaScript クロージャの説明

JavaScript クロージャの説明

1. クロージャとは何ですか?

クロージャ: 関数と、関数が宣言されている環境の状態の組み合わせ。
つまり、関数は、定義されている環境の外部で呼び出された場合でも、定義されている環境の変数にアクセスできます。

したがって、クロージャを使用すると、データとそのデータを操作する関数を関連付けることができます。

例えば:

関数foo(){
	a = 1 とします。
	関数()を返す{
		コンソールにログ出力します。
	}
}
foo1 = foo() とします。
foo1() // 出力1

これはクロージャの例です。foo では関数が返されるため、この関数には foo の内部スコープ、つまり a をカバーするクロージャがあり、その結果 a は常に存続し、foo が終了してもリサイクルされません。

2. クロージャの役割

2.1) メモリ

クロージャのメモリプロパティとは何ですか?

クロージャが生成されると、関数が配置されている環境の状態は常にメモリ内に残り、外側の関数呼び出しが終了した後、ガベージ コレクション メカニズムによって回収されません。

例えば:

関数foo(){
    a = 0 とします。
    関数()を返す{
        ++;
        コンソールにログ出力します。
    }
}
foo1 = foo() とします。
foo2 = foo() とします。
foo1(); // 1
foo2(); // 1
foo2(); // 2
foo1(); // 2

ここに画像の説明を挿入

a はクロージャの一部であるため、クロージャが生成されると、a の環境状態はメモリ内に保持され、外側の関数呼び出しが終了した後もクリアされません。そのため、foo1 が使用されると、メモリ内の a の値は 1 増加します。
この場合、foo1 と foo2 によって生成されるクロージャは、互いに影響を及ぼさない 2 つの独立したクロージャになります。したがって、foo2 が 2 回目に呼び出されると、最初の呼び出しの結果に 1 が加算されます。

2.2) プライベート変数のシミュレーション

変数が指定された操作によってのみ操作可能であることを確認します。

例えば​​:

関数foo(){
	A = 0 とします。
	戻る {
	    getA: 関数() {
	        A を返します。
	    }, 
	    追加:関数() {
	        A++;
	    },
	    del: 関数() {
	        A --;
	    }
	}
}
foo1 = foo() とします。
コンソール.log(foo1.getA()); // 0
foo1 を追加します。
コンソール.log(foo1.getA()); // 1
foo1.del();
コンソール.log(foo1.getA()); // 0

ここに画像の説明を挿入

閉包により、A は指定された加算および減算演算のみを実行できることが保証されます。

3. 閉鎖に関する注意事項

クロージャを乱用しないでください。乱用すると、メモリの過剰使用により Web ページのパフォーマンスに問題が発生し、メモリ リークが発生する可能性もあります。

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • JSにおけるクロージャの役割について詳しく話しましょう
  • JavaScriptクロージャの原理と機能の詳細な説明
  • JavaScript の高度なクロージャの説明
  • JavaScript クロージャの詳細
  • JavaScriptのクロージャとは何かを学びましょう

<<:  offsetWidth、clientWidth、scrollWidth、scrollTop、scrollLeft などのプロパティの図。

>>:  MySQL接続クエリにおけるととwhereの違いの簡単な分析

推薦する

MySQLデータベースのパスワードを忘れた場合の解決策

先ほど MySQL パスワードを設定したのに、外食したり荷物を受け取ったりするときにパスワードを忘れ...

And キーワードを使用した MySQL の複数条件クエリ ステートメント

AND キーワードを使用した MySQL 複数条件クエリ。MySQL では、AND キーワードを使用...

Manjaro インストール CUDA 実装チュートリアル分析

昨年末、Thinkpad T450 のデュアルシステムの opensuse を Manjaro に置...

js に基づいて大きなファイルのアップロードとブレークポイントの再開を管理する方法

目次序文フロントエンド構造バックエンド構造(ノード+エクスプレス) FormDataに基づくファイル...

MySQL テーブルの追加、削除、変更、クエリの基本チュートリアル

1. 作成する [テーブル名] (フィールド1、フィールド2、...) 値 (値1、値2、...) ...

MySQL5.7 マスタースレーブ構成例の分析

MySQL5.7マスタースレーブ構成の実装方法、具体的な内容は次のとおりですインストール環境:マスタ...

MySQLシリーズ マルチテーブル結合クエリ92および99構文例詳細チュートリアル

目次1. デカルト積現象2. 接続クエリの知識ポイントのまとめ1) 結合クエリとは何ですか? 2) ...

CentOS7でMySQL 5.7をアンインストールする方法

MySQLに何がインストールされているか確認する rpm -qa | grep -i mysql n...

TCP 3 回目のハンドシェイク データ転送プロセス図

RFC793 ドキュメントの SYN フラグを持つプロセス パケットはデータを伝送できません。つま...

Ubuntu 18.04 のすべての Python ライブラリを一度にアップグレードする方法

ピップとは何かpip は、Python パッケージの検索、ダウンロード、インストール、アンインストー...

Node8 における AsyncHooks 非同期ライフサイクル

Async Hooks は Node8 の新機能です。NodeJs の非同期リソースのライフサイクル...

Mac で Docker を使用して Oracle をデプロイする方法

Mac で Docker を使用して Oracle をデプロイする方法まずdockerをインストール...

JavaScript WeakMap の使い方の詳しい説明

WeakMap オブジェクトは、キーが弱参照であるキー/値のペアのコレクションです。キーはオブジェク...

Web 開発チュートリアル クロスドメイン ソリューションの詳細な説明

序文この記事では、主にWeb開発のためのクロスドメインソリューションを紹介し、参考と学習のために共有...

js キャンバスで円形の水のアニメーションを実現

この記事の例では、円形の水のアニメーションを実現するためのキャンバスの具体的なコードを参考までに共有...