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の違いの簡単な分析

推薦する

Docker データ管理 (データ ボリュームとデータ ボリューム コンテナー) の詳細な説明

実稼働環境で Docker を使用する場合、多くの場合、データを複数のコンテナ間で永続化または共有す...

Linux でハードディスクのサイズを確認し、ハードディスクをマウントする方法

Linux には、マウントされたハードディスクとマウントされていないハードディスクの 2 種類のハー...

Web デザインの経験: 独善的な Web デザイナー

1. ゴミかクラシックか? Web テクノロジーは急速に更新されており、Web サイトのインターフェ...

クラウドデータ移行サービスの観点から見たMySQLの大規模テーブル抽出モードの原理分析

概要: MySQL JDBC 抽出にはどのような方法を使用すればよいでしょうか? その方法を説明しま...

HTML入力ファイルコントロールはアップロードされるファイルの種類を制限します

入力ファイルの HTML コントロールを Web ページに追加します。 <input id=&...

テーブル切り替えのための JavaScript プラグインのカプセル化

この記事では、テーブル切り替えプラグインを実装するためのJavaScriptのカプセル化コードを参考...

docker のインストールが完了し、bridge-nf-call-iptables が無効であると報告される問題を解決します

Centos マシンで docker のインストールが完了したら、docker info コマンドを...

JavaScript プロトタイプとプロトタイプチェーンの深い理解

目次1. プロトタイプとは何ですか? 2. プロトタイプ__プロト__ 4. コンストラクター5. ...

MySQLの認証コマンドgrantの使い方

この記事の例は MySQL 5.0 以降で実行されます。ユーザー権限を付与するための MySQL コ...

nginx で http でアクセスする Web サイトを https に変更する方法

目次1. 背景2. 前提条件https:証明書システム: 3. 操作プロセス3.1 証明書の生成3....

ECMAScript6 におけるマップマッピングの基本概念と一般的な方法

目次マッピングとは何かオブジェクトとマップの違いマップの共通メソッド宣言と初期化割り当てセットキー値...

MYSQL SERVER のログファイルを縮小する方法

トランザクション ログには、関連するデータベースに対する操作が記録され、データベースの回復に関連する...

RR および RC 分離レベルでのインデックスとロックのテスト スクリプトのサンプル コード

基本概念現在の読み取りとスナップショットの読み取りMVCC では、読み取り操作はスナップショット読み...

MySQL の重要なパフォーマンス インデックスの計算と最適化方法の概要

1 QPS 計算 (1 秒あたりのクエリ数) MyISAMエンジンベースのDBの場合 MySQL&g...

Linux リモートログイン実装チュートリアル分析

Linux は一般的にサーバーとして使用され、サーバーは一般的にコンピュータルーム内に置かれます。L...