teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ちょっとだけ表現を変えた

2020/02/14 22:42

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  さて、変数は環境レコードに束縛されているという名前付きの値と言うことでした。これはどういうことかというと、ある環境で変数が宣言されると、その宣言が書かれたレキシカル環境の環境レコードにその変数名で値が束縛されます。ただし、`var`を使った場合と関数宣言の場合は特殊で、関数環境、モジュール環境、グローバル環境のうち一番近い環境の環境レコードに束縛されます。値の初期状態では、宣言の方法によって異なり、指定された値になる、`undefined`になる、または、未初期化(uninitialized)という特別な状態になるかのいずれかです。この束縛処理はレキシカル環境の評価の開始時に、存在する全ての変数に対して行われます。※
50
50
 
51
- ※ 変数に初期値が代入される宣言文が来たときで、それまでは開始時に入れられた値が使われます。`var`で宣言されたは最初に`undefined`が入るため、宣言文の前に変数にアクセスしてもエラーになりません。`let`と`const`で宣言された変数は未初期化(uninitialized)という特別な状態になるため、宣言文の前に変数にアクセスしようとする`ReferenceError`例外が発生します。いずれの場合も、変数自体は宣言文が来る前に存在していることに注意してください。この動作はC等の他言語にはあまり見られない、ECMAScript特有のものです。
51
+ 関数宣言を除き、変数に指定された初期値が代入されるタイミングは宣言文が来たときであり、それまでは開始時の変数作成時に入れられた値が使われます。`var`で宣言されたは最初に`undefined`が入るため、宣言文の前に変数にアクセスしてもエラーになりません。`let`と`const`で宣言された変数は未初期化(uninitialized)という特別な状態になるため、宣言文の前に変数にアクセスしようとする`ReferenceError`例外が発生します。いずれの場合も、変数自体は宣言文が来る前に存在していることに注意してください。この動作はC等の他言語にはあまり見られない、ECMAScript特有のものです。
52
52
 
53
53
  では、今度はアクセスがどうなるかを見てみましょう。あるレキシカル環境で変数にアクセスしたとき(変数への代入含むが、宣言は含まない)、そのレキシカル環境での環境レコードに変数名で索漠された値があるかどうかを見に行きます。もし、環境レコードに変数名の値があれば、その値を取得する(代入であれば指定の値を代入する)ことになります。逆に、変数名が環境レコードになかった場合、今度はそのレキシカル環境の外側(oute)のレキシカル環境の環境レコードを見に行きます。もし、そこにあればその値の取得(または指定の値の代入)、なければまた外側、と内から外へ順番に辿っていきます。一番外側のグローバル環境の環境レコード※にもなければ、`ReferenceError `になります。
54
54
 

1

ちょっとだけ変えた

2020/02/14 22:42

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  まず始めに、知っておかなくてはならない用語があります。それはレキシカル環境(lexical environment)と環境レコード(environment record)です。**変数とは、宣言された場所に基づくレキシカル環境の環境レコードに変数名で束縛された(bound)値です。**この値はプリミティブ値(primitive value)またはオブジェクト(object)です。なんか似たようなものを見たことがありませんか?そう、通常のオブジェクトにおけるプロパティもプロパティ名で束縛された値でした。全く一緒というわけではありませんが、環境レコードをオブジェクトとみなした場合、変数として束縛されたものは環境レコードのプロパティのようなものと捉えることができます。
16
16
 
17
- ここまではついてきていますか?よし、いいでしょう。よくわからないレキシカル環境というものが出てきました。まずは、これを読み解く必要があります。レキシカル環境とは文法上区別された一定の範囲のことです。トップレベルのスクリプト全体、モジュール、関数定義、ブロック文等があります。特別なものとして、トップレベルに使われるグローバル環境(global environment)、モジュール環境(module environment)、関数環境(function environment)があります。それぞれの環境はグローバル環境が一番外側にあって、ネストされた構成になっています。(今回、モジュール環境については説明しません。)
17
+ ここまではついてきていますか?よし、いいでしょう。よくわからないレキシカル環境というものが出てきました。まずは、これを読み解く必要があります。レキシカル環境とは文法上区別された一定の範囲のことです。トップレベルのスクリプト全体、モジュール、関数定義、ブロック文等があります。特別なものとして、トップレベルに使われるグローバル環境(global environment)、モジュールで使われるモジュール環境(module environment)、関数で使われる関数環境(function environment)があり、ちょっとだけ特別な動作をします。if文のブロックとかは通常のレキシカル環境です。それぞれの環境はグローバル環境が一番外側にあって、ネストされた構成になっています。(今回、モジュール環境については説明しません。)
18
18
 
19
19
  ```JavaScript
20
20
  // グローバル環境 ===>