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

推薦する

SQL 最適化チュートリアル: IN クエリと RANGE クエリ

序文「High Performance MySQL」では、インデックスでは範囲フィールドの後の部分が...

国内SNSのホームページを比較・分析して得た経験をみんなで共有(写真)

この記事では、ソーシャル ウェブサイトのホームページを比較分析することで洞察を得て、ソーシャル ウェ...

親要素に対する CSS 子要素の配置の実装

解決親要素に position:relative を追加します。子要素に position:abso...

MySQL ルートパスワードを変更する 4 つの方法 (要約)

方法1: SET PASSWORDコマンドを使用するまずMySQLにログインします。フォーマット: ...

Vue のフィルターの適用シナリオの詳細な説明

filterは通常、特定の値をフィルターするために使用されます。たとえば、フィールドが空だが、フロン...

HTML フォーマットの json のサンプルコード

さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 <!DOCTYPE htm...

http:// の代わりに // を使用する利点は何ですか (アダプティブ https)

//デフォルトプロトコル/ デフォルト プロトコルの使用は、リソース アクセス プロトコルが現在の...

SQL で行の最大値または最小値を取得する方法

元データと対象データSQL文を実装する(最大) 選択 店、 月、 最大(dz,fz,sp) が最大値...

Vueを使用して天気コンポーネントをロードする方法の詳細な説明

この記事では、Vueを使用して天気コンポーネントをロードする方法を参考までに紹介します。具体的な内容...

超詳細なMySQL使用仕様の共有

最近、データベース関連の操作が多くなり、会社の既存の仕様はあまり包括的ではありません。インターネット...

Linux でハイパースレッディング技術を動的に有効/無効にする方法の詳細な説明

序文Intel のハイパースレッディング テクノロジーにより、1 つの物理コア上で 2 つのスレッド...

WeChat ミニプログラム ユーザー認証のベストプラクティス ガイド

序文WeChat アプレットを開発する際には、ユーザーの権限が必要なページを使用する必要があることが...

Nginx のステータス監視とログ分析の詳細な説明

1. Nginx ステータス監視Nginx には、Nginx の全体的なアクセス ステータスを監視す...

Ubuntu 20.04 LTSの詳細なインストール履歴

この記事では、USB ブート ディスクの作成とシステムのインストールについて説明します。システム構成...

MySQL で重複行を見つけて削除する方法

目次1. 重複行を見つける方法2. 重複行を削除する方法3. 複数の列で重複を見つける方法4. クエ...