ホームページ > 記事 > ウェブフロントエンド > JavaScript クロージャー_JavaScript スキル
はじめに
クロージャ
いわゆる「クロージャ」は、多くの変数とこれらの変数にバインドされた環境を持つ式 (通常は関数) を指します。したがって、これらの変数も式部分の一部です。
クロージャは ECMAScript (JavaScript) の最も強力な機能の 1 つですが、クロージャを適切に使用するための前提条件はクロージャを理解することです。クロージャは比較的簡単に作成できるため、意図せず作成してしまう可能性もありますが、特に一般的なブラウザ環境では、潜在的に有害です。クロージャを利点を活かして使用し、欠点を回避したい場合は、クロージャがどのように機能するかを理解する必要があります。クロージャ動作メカニズムの実装は、識別子 (またはオブジェクト属性) の解析プロセスにおけるスコープの役割に大きく依存します。
クロージャを記述する最も簡単な方法は、ECMAScript で内部関数の使用を許可することです。つまり、関数定義と関数式は別の関数の関数本体内に配置されます。さらに、これらの内部関数は、すべてのローカル変数、パラメータ、およびそれらが存在する外部関数で宣言された他の内部関数にアクセスできます。クロージャは、これらの内部関数の 1 つが、それらを含む外部関数の外側で呼び出されるときに形成されます。つまり、内側の関数は外側の関数が戻った後に実行されます。この内部関数が実行されるときも、ローカル変数、パラメーター、および外部関数の他の内部関数にアクセスする必要があります。これらのローカル変数、パラメータ、関数宣言の値は(最初は)外側の関数が戻ったときの値ですが、内側の関数の影響も受けます。
残念ながら、クロージャを正しく理解するには、クロージャの背後にある仕組みと、関連する技術的な詳細の多くを理解する必要があります。この記事の前半では ECMA 262 仕様で指定されているアルゴリズムの一部については説明していませんが、回避または簡略化できないアルゴリズムはまだたくさんあります。オブジェクト属性の名前解決に精通している人は、関連する内容をスキップできますが、クロージャにも精通していない限り、次のセクションをスキップしないことをお勧めします。
オブジェクト属性名の解決
ECMAScript は、ネイティブ オブジェクトとホスト オブジェクトの 2 種類のオブジェクトを認識します。ホスト オブジェクトには、組み込みオブジェクトと呼ばれるネイティブ オブジェクトのサブクラスが含まれています (ECMA 262 第 3 版セクション 4.3)。 。ネイティブ オブジェクトは言語に属しますが、ホスト オブジェクトはドキュメント オブジェクト、DOM、および同様のオブジェクトなどの環境によって提供されます。
ネイティブ オブジェクトには、大まかに動的に名前が付けられたプロパティがあります (組み込みオブジェクト サブクラスの一部の実装では動的が制限されていますが、それはそれほど問題ではありません)。オブジェクトの名前付きプロパティは、値を保存するために使用されます。値は、別のオブジェクト (オブジェクト) への参照にすることも (この意味では、関数もオブジェクトです)、文字列、数値、などの基本的なデータ型にすることもできます。ブール値、Null、または未定義。より特別なものは、オブジェクトの対応するプロパティを削除せずに、オブジェクトのプロパティに Unknown タイプの値を割り当てることができるため、Unknown タイプです。さらに、このプロパティは未定義の値を保持するだけです。
以下は、オブジェクトの属性値を設定および読み取り、対応する内部詳細を最大限に反映する方法について簡単に紹介します。
値の割り当て
オブジェクトの名前付きプロパティは、名前付きプロパティに値を割り当てることで作成または再割り当てできます。つまり、
var objectRef = new Object(); // 通常の JavaScript オブジェクトを作成します。
「testNumber」という名前のプロパティは、次のステートメントによって作成できます:
objectRef.testNumber = 5;
/* - または - */
objectRef["testNumber"] = 5 ;
代入前はオブジェクトに「testNumber」属性がありませんが、代入後は属性が作成されます。後続の代入ステートメントでは、このプロパティを再度作成する必要はなく、その値をリセットするだけです:
objectRef.testNumber = 8;
/* - または - */
objectRef[" testNumber"] = 8;
JavaScript オブジェクトにはプロトタイプ プロパティがあり、これらのプロトタイプ自体もオブジェクトであるため、名前付きプロパティを持つこともできることを後で紹介します。ただし、プロパティという名前のプロトタイプ オブジェクトの役割は、割り当てフェーズには反映されません。同様に、名前付きプロパティに値を割り当てる場合、オブジェクトにそのプロパティがない場合は名前付きプロパティが作成され、そうでない場合はプロパティの値がリセットされます。
詳細については、次の記事を参照してください:
http://demo.jb51.net/js/javascript_bibao/index.htm