62

javascriptのレキシカル環境とスコープは同じものですか?

4

3 に答える 3

62

「JavaScript忍者の秘密、2 / e」から学んだばかりのことに基づいて答えを出す -

それらは異なる概念ですが、関連しています。関連する概念を定義する必要があります-実行コンテキストと理解するスタックです。

実行コンテキスト実行コンテキスト スタック:実行コンテキストは、関数またはグローバル コードの実行を追跡するための内部 JavaScript コンストラクトです。js エンジンはスタック データ構造 (これらのコンテキストを含む実行コンテキスト スタックまたは呼び出しスタック) を維持し、グローバル実行コンテキストはこのスタックの一番下に留まります。そして、関数の実行が開始されると、新しい実行コンテキストが作成され、スタックにプッシュされます。特定の実行コンテキストは、対応する関数のステートメントが実行されているポインターを追跡します。対応する関数の実行が終了すると、実行コンテキストがスタックからポップされます。

レキシカル環境:識別子と変数のマッピングを保持する内部 js エンジン構造です。(ここで、識別子は変数/関数の名前を指し、変数は実際のオブジェクト [関数型オブジェクトを含む] またはプリミティブ値への参照です)。レキシカル環境は、親のレキシカル環境への参照も保持します。

ここで、実行コンテキストごとに-- 1)対応するレキシカル環境が作成され、2)その実行コンテキストで関数が作成された場合、そのレキシカル環境への参照がその関数の内部プロパティ ( [[Environment]] ) に格納されます。 . したがって、すべての関数は、それが作成された実行コンテキストに関連するレキシカル環境を追跡します。

そして、すべての字句環境は、その親字句環境 (親実行コンテキストの環境) を追跡します。その結果、すべての関数には一連のレキシカル環境が関連付けられています。[注: js では関数はオブジェクトです。ステートメントで関数を作成することは、タイプ Function のオブジェクトを作成することを意味します。したがって、他のオブジェクトと同様に、関数は内部およびユーザー定義の両方のプロパティを保持できます]

スコープ: 実行中のコードに対する変数または関数の可視性を参照することは、言語に依存しない概念です。js では、変数または関数は、現在のレキシカル環境またはエンクロージング関数のレキシカル環境チェーンにある場合、実行中のコードに表示されます。グローバル コードの場合、チェーンは存在しません。

願っています、あなたは今理解しています..

注: 関数の場合と同様に、es6 でのlet と constの導入により、ブロックの実行が開始されると ( ifブロック、for ループブロックなど)、親関数の字句環境を親として持つ新しい字句環境も作成されます。

于 2018-05-04T11:49:07.627 に答える
30

レキシカル環境に関する仕様の内容は次のとおりです。

レキシカル環境は、ECMAScript コードのレキシカル ネスト構造に基づいて、識別子と特定の変数および関数との関連付けを定義するために使用される仕様タイプです。レキシカル環境は、環境レコードと、場合によっては外部レキシカル環境への null 参照で構成されます。

それに基づいて、私はイエスと言うでしょう、それは人々が「スコープ」と言うときに通常話していることです.

おそらく、「スコープ」は実際には「宣言型環境レコード」として定義されていると主張できますが、

各宣言型環境レコードは、変数や関数の宣言を含む ECMAScript プログラム スコープに関連付けられています。宣言型環境レコードは、そのスコープ内に含まれる宣言によって定義された一連の識別子をバインドします。

「スコープ」を識別子と値の間のバインディングを含むものと考える場合、2 番目の定義の方がおそらく適切です。祖先のスコープを認識しているものと考えると、最初の定義の方が適しています。

編集:3番目のオプションは「実行コンテキスト」です。

于 2012-09-26T10:47:23.853 に答える