ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript スコープ チェーン パート 1: スコープ チェーンの定義

JavaScript スコープ チェーン パート 1: スコープ チェーンの定義

黄舟
黄舟オリジナル
2016-12-20 16:16:351084ブラウズ

実行コンテキストのデータ (変数、関数宣言、関数パラメーター) は、変数オブジェクトのプロパティとして保存されます。変数オブジェクトは、コンテキストが入力され、初期値が入力されるたびに作成され、値の更新はコード実行フェーズ中に行われます。

この章では、実行コンテキストに直接関連する詳細について説明します。今回は、スコープ チェーンについて説明します。

重要なポイントを簡単に説明して示したい場合は、スコープチェーンは主に内部関数に関連しています。

ECMAScript では内部関数の作成が可能であり、これらの関数を親関数から返すこともできることはわかっています。

var x = 10;
  
function foo() { 
  var y = 20; 
  function bar() {
    alert(x + y);
  } 
  return bar; 
}
  
foo()(); // 30

このように、各コンテキストには独自の変数オブジェクトがあることは明らかです。グローバル コンテキストの場合、それは関数のグローバル オブジェクト自体であり、アクティブなオブジェクトです。

スコープ チェーンは、内部コンテキスト内のすべての変数オブジェクト (親変数オブジェクトを含む) の単なるリストです。このチェーンは変数クエリに使用されます。つまり、上記の例では、「bar」コンテキストのスコープ チェーンには、AO(bar)、AO(foo)、および VO(global) が含まれます。

しかし、この問題を詳しく見てみましょう。

定義から始めて、例について詳しく説明しましょう。

スコープ チェーンは実行コンテキストに関連付けられ、変数オブジェクトのチェーンは識別子の解決における変数の検索に使用されます。

関数コンテキストのスコープ チェーンは、関数が呼び出されたときに作成されます。これには、この関数内のアクティブ オブジェクトと [[scope]] 属性が含まれます。以下では、関数の [[scope]] 属性について詳しく説明します。

はコンテキスト内で次のように表されます:

activeExecutionContext = {
    VO: {...}, // or AO
    this: thisValue,
    Scope: [ // Scope chain
      // 所有变量对象的列表
      // for identifiers lookup
    ]
};

そのスコープは次のように定義されます:

Scope = AO + [[Scope]]

この共用体と識別子の解決プロセスは、以下で説明しますが、関数のライフサイクルに関連しています。

上記は JavaScript のスコープ チェーン 1: スコープ チェーンの定義の内容です。その他の関連コンテンツについては、PHP の中国語 Web サイト (www.php.cn) に注目してください。


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