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

推薦する

JavaScriptの記事では、Webフォームの操作方法を説明します。

1. はじめに先ほど、ウェブページの急速な発展について紹介しました。今回は、より深い内容についてお...

CSSの4種類の配置の違いの詳細な説明

フロントエンド開発でよく使われるCSSの配置方法は、位置決めには、通常位置決め、相対位置決め、絶対位...

Vueフロントエンドパッケージングの詳細なプロセス

目次1. パッケージ化コマンドを追加する2. パッケージ化されたコードを実行する3. パッケージ化し...

Dockerでspringcloudプロジェクトをデプロイする方法

目次Dockerイメージのダウンロードmysqlとnacosを起動する独自のJavaプロジェクトを変...

MySQLで一意のサーバーIDを生成する方法

序文MySQL では、server-id を使用してデータベース インスタンスを一意に識別し、それを...

Win32 MySQL 5.7.27 のインストールと設定方法のグラフィックチュートリアル

MySQL 5.7.27のインストールチュートリアルは以下のように記録され、皆さんと共有されています...

Tencent Cloud で HTTPS を無料で導入する方法

最近、WeChatアプレットを書いていたとき、WeChatアプレットではすべてのリクエストインターフ...

Vue プロジェクトはファイルダウンロードの進行状況バー機能を実装します

日常業務でファイルをダウンロードする一般的な方法は 2 つあります。 1 つ目は、サーバーのファイル...

Vue はグラフィック検証コードログインを実装します

この記事では、グラフィック認証コードログインを実装するためのVueの具体的なコードを参考までに紹介し...

CSSはメッセージパネルをスライドするWebコンポーネント機能を実装します

みなさんこんにちは。私と同じように混乱している方はいらっしゃいませんか。CSS は簡単に始められます...

DockerはRedisをインストールし、操作用のビジュアルクライアントを導入します

1 はじめにRedis 、 ANSI C言語で開発されたKey-Valueベースの高性能NoSQLデ...

自動検索提案機能のスタイルファイルを入力します: suggestion.css

コードをコピーコードは次のとおりです。 .sugLayerDiv{位置:相対; overflow:h...

49 個の JavaScript のヒントとコツ

目次1. js整数の演算2. ネイティブアラートを書き換えてポップアップボックスの数を記録する3. ...

CentOS 7 で Docker のポート転送をファイアウォールと互換性のあるように設定する方法

CentOS 7 では、次のようなコマンドを使用してホスト ポートをコンテナー ポートにマッピングす...

マインドマップを使って4つの側面からWeb標準の価値を議論する

このアイデアを改善し、より良い意見を得られることを期待して、議論を刺激するためにいくつかの値を大まか...