ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript のスコープ チェーンとクロージャ

JavaScript のスコープ チェーンとクロージャ

高洛峰
高洛峰オリジナル
2016-11-26 13:11:00977ブラウズ

• スコープ
o グローバルスコープ
o ローカルスコープ
• スコープチェーン
• 実行コンテキスト
• アクティブオブジェクト
• クロージャ
• クロージャの最適化
JavaScript にはこれまで学んだことのない概念があります — クロージャ。閉鎖とは何ですか?表面的に理解すると、これはクローズドパッケージであり、スコープに関係します。したがって、クロージャについて話す前に、スコープについて話しましょう。 sscope一般的に、プログラムコードで使用される変数と関数は常に利用可能であるとは限りません。
グローバル スコープ
コード内のどこからでもアクセスできるオブジェクトには、グローバル スコープがあります。
1. 最も外側の関数と、最も外側の関数の外側で定義された変数には、グローバル スコープがあります。例:
[javascript]
1. var outSide="var 外側";
3. var name="var inside"
5. アラート(名前);ウィンドウ オブジェクトのすべてのプロパティにはグローバル スコープがあります。たとえば、ウィンドウ オブジェクトの組み込みプロパティには、window.name、window.location、window.top などのグローバル スコープがあります。
ローカル スコープ (ローカル スコープ) )
[javascript]
1. function outFunction(){
2. var name="inside name";
4. alert(name ; )
JavaScript では、関数を含むすべてのものはオブジェクトです。関数オブジェクトには、他のオブジェクトと同様に、コードを通じてアクセスできるプロパティと、JavaScript エンジンのみがアクセスできる一連の内部プロパティがあります。内部プロパティの 1 つはスコープです。これには、関数が作成されたスコープ内のオブジェクトのコレクションが含まれます。これは、関数のスコープ チェーンと呼ばれ、関数がアクセスできるデータを決定します。
関数が作成されると、そのスコープ チェーンは、関数が作成されたスコープでアクセス可能なデータ オブジェクトで埋められます。たとえば、関数:
[javascript]
1. function add(num1,num2) {
2. var sum = num1 +
4. 関数 add が作成されると、スコープ グローバル オブジェクトは、下の図に示すように、すべてのグローバル変数を含むチェーン内に埋められます (注: この図はすべての変数の一部のみを示しています):



関数の作成時に関数のスコープチェーンが作成されることがわかります。
実行コンテキスト (Execute context)
関数 add のスコープは実行中に使用されます。例:
[javascript]
1. var total = add(5,10);

add 関数が実行されると、JavaScript実行コンテキストが作成されます。これには、実行時に追加関数で必要なすべての情報が含まれます。実行コンテキストには独自のスコープ チェーンもあります。関数が実行されると、JavaScript エンジンはまず add 関数を使用してスコープ チェーンから実行コンテキストのスコープ チェーンを初期化します。
アクティブ オブジェクト
その後、JavaScript エンジンはアクティブ オブジェクトを作成します。これらの値は、関数内に表示される順序でランタイム コンテキストのスコープ チェーンにコピーされ、一緒に新しいオブジェクトを形成します。 "、このオブジェクトには、関数の実行時にすべてのローカル変数、パラメーター、およびこの変数とその他の変数が含まれます。このオブジェクトはスコープ チェーンのフロント エンドにプッシュされます。実行時コンテキストが破棄されると、アクティブ化オブジェクトも破棄されます。新しいスコープ チェーンを以下の図に示します。

JavaScript のスコープ チェーンとクロージャ

実行コンテキストは、関数の実行時に作成されます。アクティブ オブジェクトも、スコープ チェーンによって参照されます。実行コンテキストのスコープ チェーンは、実行コンテキストとアクティブ オブジェクトの両方が動的概念であり、関数スコープ チェーンによって初期化されると結論付けることができます。过 関数の実行プロセス中、変数に遭遇するたびに、データを取得して保存する場所を取得します。このプロセスはドメイン チェーン ヘッドから始まり、アクティビティのオブジェクトから始まり、その識別子が見つかります。この識別子に対応する変数がない場合は、検索後にすべてのオブジェクトが見つからない場合、その識別子は未定義とみなされます。関数の実行では、各識別子はこのような検索プロセスを経る必要があります。
クロージャ (クロージャ)
まず、JavaScript コードの例を見てみましょう:
[javascript]
1.

JavaScript のスコープ チェーンとクロージャ

クロージャの最適化
クロージャには見たくない結果があるため、最適化する必要があります。最適化された JavaScript (その他の定数):
[javascript]
1. & Lt; スクリプト タイプ = "text/javascript" & gt; {// 新しいページの読み込みイベント i = 1; 3;結果: プロンプトに対応するプロンプト 情報



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:詳細はJavaScriptで次の記事:詳細はJavaScriptで