訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
語彙環境(Lexical Environment)とは、固有の変数におけるIdentifiers(識別子)との関連付けを定義する為に使用される仕様上の種類であり、関数は、語彙的にネストしたECMAScriptコードの構造に基づきます。 語彙環境は、環境レコード(Environment Record)とnullである可能性もある外部の語彙的な環境への参照から成ります。 通常、語彙環境は、FunctionDeclaration (関数宣言)、WithStatement (With 文)、TryStatement (Try 文)のCatch句、または、そのようなコードが評価されるごとに生成される新たな語彙環境のようなECMAScriptのコードの同一の特定の構文上で関連付けされます。 環境レコードは、関連付けた語彙環境のスコープ内で生成される関連付けした識別子を記録します。 外部環境の参照は、語彙環境の値から成る論理的なネストを形成する為に使用されます。 (内部の)語彙環境の外部参照は、内部の語彙環境を論理的に括る語彙環境を参照します。 外部の語彙環境は、当然ながら、外部の語彙環境それ自身を持ちます。 語彙環境は、複数の内部の語彙環境における外部の環境として提供される場合があります。 例えば、FunctionDeclarationが2つのネストしたFunctionDeclarationsを含む場合、ネストした2つの関数ごとの語彙環境は、囲まれた関数について現在実行中の語彙環境を外部の語彙環境として持ちます。 語彙環境と環境レコードの値は、単に仕様上の仕組みであり、ECMAScriptの実装における人為的な一部仕様と一致する必要はありません。 それは、ECMAScriptのプログラムにおいて、そのような値に直接アクセスしたり、直接、値を操作することを可能にします。
宣言型環境レコードとオブジェクト型環境レコードという種類が2つある環境レコードの値は、この仕様の中で使用されます。 宣言型環境レコードは、ECMAScript言語の値と直接関連付ける識別子バインディングであるFunctionDeclarations、VariableDeclarationsとCatch句のようなECMAScript言語の構文上の要素の効果を定義する為に使用されます。 オブジェクト型環境レコードは、一部のオブジェクトのプロパティを伴う識別子バインディングとの関連付けである Program と WithStatement のようなECMAScriptの要素の効果を定義する為に使用されます。 仕様目的における環境レコードの値は、宣言型環境レコードとオブジェクト型環境レコードという具体的な2つのサブクラスを伴う抽象クラスである環境レコードにおけるオブジェクト指向的な階層内に存在するかのように考えることができます。 抽象クラスは、Table 17で定義した抽象仕様メソッドを含みます。 これらの抽象メソッドは、具体的なサブクラスごとの明らかに異なる具体的なアルゴリズムを持ちます。
Table 17 -- 環境レコードの抽象メソッド ------------------------------------------------------------------------------------------------------------- メソッド 目的 ------------------------------------------------------------------------------------------------------------- HasBinding(N) 環境レコードが識別子におけるバインディングを持つ場合に決定 持てばtrue、持たなければfalse String型の値 N は、識別子のテキスト CreateMutableBinding(N, D) 環境レコード内に新たに変更可能なバインディングを生成 String型の値 N は、バインドされた名前としてのテキスト オプションのBoolean型引数 D が、trueである場合には、バインディングは順次削除される可能性がある SetMutableBinding(N, V, S) 環境レコード内に既に存在する変更可能なバインディングの値を設定 String型の値 N は、バインドされた名前としてのテキスト V は、バインディングにおける値であり、一部のECMAScript言語の型の値になる場合がある S は、Booleanフラグ S が、true で且つバインディングが設定できない場合には、TypeError例外を投げる(スローする) S は、strict(厳格)モード参照を識別する為に使用される GetBindingValue(N,S) 環境レコードから既存のバインディングの値を返す String型の値 N は、バインドされた名前としてのテキスト S は、strict(厳格)モード参照を識別する為に使用される S が、trueで且つバインディングするものが存在しない場合や初期化されていない場合には、ReferenceError例外を投げる(スローする) DeleteBinding(N) 環境レコードからバインディングを削除 String型の値 N は、バインドされた名前としてのテキスト 既存の N におけるバインディングが存在する場合には、そのバインディングを削除し、true を返す バインディングは存在するが削除できない場合には、false を返す バインディングが存在しない場合には、true を返す ImplicitThisValue() 当該環境レコードから値をバインディングする値を関数オブジェクトを呼ぶことによって取得される当該値と同様に使用する為の値を返す -------------------------------------------------------------------------------------------------------------
各宣言型環境レコードは、変数と(や)関数宣言を含むECMAScriptプログラムにおけるスコープと関連付けられます。 宣言型環境レコードは、そのスコープ内に含まれる宣言によって定義した識別子の集合をバインドします(関連付けます)。 追記すると変更可能なバインディングは、全ての環境レコードによってサポートされ、宣言型環境レコードはまた恒久的なバインディングについても提供します。 恒久的なバインディングとは、識別子と生成されてすぐに変更されない値との間を関連付けることもその1つです。 恒久的なバインディングの生成と初期化は、初期化された、または初期化されていない状態の何れにも存在する為、このように関連付けて利用することが可能なので、そのステップは異なります。 宣言型環境レコードは、環境レコード抽象仕様メソッドにおける付記にある Table 18 の中で列挙したメソッドをサポートします。
Table 18 -- 宣言型環境レコードの追加のメソッド ------------------------------------------------------------------------------------------------------------- メソッド 目的 ------------------------------------------------------------------------------------------------------------- CreateImmutableBinding(N) 新たに生成するが、初期化されず、環境レコード内で恒久的に関連付ける String型の値 N は、バインドされた名前としてのテキスト InitializeImmutableBinding(N,V) 既存の値を設定するが、初期化されず、環境レコード内で恒久的に関連付ける String型の値 N は、バインドされた名前としてのテキスト V は、バインディングにおける値であり、一部のECMAScript言語の型の値 -------------------------------------------------------------------------------------------------------------
宣言型環境レコードにおける具体的な仕様メソッドの動作は、次のアルゴリズムによって定義されます。
宣言型環境レコードにおける具体的な環境レコードメソッドHasBindingは、単に引数の識別子が、レコードによってバインドされる識別子の1つである場合に決められます。
1.envRecは、メソッドが実行された場合に宣言型環境レコードとする 2.envRecが N という値の 名称によるバインディング(結びつき)を持つ場合には、true を返す 3.そのようなバインディングを持たない場合には、falseを返す
宣言型環境レコードにおける具体的な環境レコードのメソッドCreateMutableBindingは、新たに値undefinedに初期化される名称 N という変更可能なバインディングを生成します。 バインディングは、既存の N という環境レコードがあってはいけません。 Boolean型の引数 D が提供され、値が true である場合には、新たなバインディングは、削除の対象としてマークされます。
1.envRecは実行されたメソッドにおける宣言型環境レコードとする 2.Assert:envRecは、N という 既存のバインディングを持たない 3. N において envRec 内に変更可能なバインディングを生成し、そのバインド値としてundefinedを設定 D がtrueであり、新たに生成したバインディングであるレコードである場合には、順次DeleteBindingを呼ぶことによって削除される場合がある
宣言型環境レコードにおける具体的な環境レコードのメソッドSetMutableBindingは、引数 V の値について引数 N という値である名前を持つ識別子としての現在のバインディングのバインド値の変更を試行します。 N というバインディングは既に存在しなければいけません。 バインディングが恒久的なバインディングである場合には、 S が true である場合、TypeErrorが投げられ(スローされ)ます。
1.envRecは、実行される当該メソッドにおける宣言型環境レコードとする 2.Assert:envRecは N というバインディングを持たなければならない 3.envRecにある N というバインディングが変更可能なバインディングである場合には、そのバインド値を V に変更する 4.それ以外の場合、S が true である場合、TypeError例外を投げる(スローする)為、恒久的なバインディングの値への変更を試行しなければならない
宣言型環境レコードにおける具体的な環境レコードのメソッドGetBindingValueは、単に引数 N の値である名称を持つ当該バインド識別子の値を返します。 当該バインディングは既に存在しなければいけません。 S が true で且つ当該バインディングが初期化されていない場合、恒久的なバインディングは、ReferenceError例外を投げます。
1.envRecは、実行されたメソッドにおける宣言型環境レコードとする 2.Assert: envRecは、N というバインディングを持つ 3.envRec内の N というバインディングが、恒久的なバインディングとして初期化されていない場合、 a. S がfalseである場合、値undefinedを返し、それ以外はReferenceError例外を投げる(スローする) 4.それ以外は、envRec内の N への値currently bound(現在のバインド値)を返す
宣言型環境レコードにおける具体的な環境レコードのメソッドDeleteBindingは、削除の対象として明示的に指定されているバインディングだけを削除することが可能です。
1.envRecは、実行されたメソッドにおける宣言型環境レコードとする 2.envRecがNという値の名称におけるバインディングを持たない場合、trueを返す 3.envRec内にあるNというバインディングは削除不可であり、falseを返す 4.envRecからNというバインディングを削除 5.trueを返す
宣言型環境レコードは常にそれらのImplicitThisValueとしてundefinedを返します。
1.undefinedを返す
宣言型環境レコードにおける具体的な環境レコードのメソッドCreateImmutableBindingは、値undefinedに初期化される名称 N という新しい恒久的なバインディングを生成します。 バインディングは、Nという環境レコード内に事前に存在してはいけません。
1.envRecは、実行されたメソッドにおける宣言型環境レコードとする 2.Assert:envRecは、まだNというバインディングを持たない 3.NというenvRec内に恒久的なバインディングを生成、レコードは初期化されない
宣言型環境レコードにおける具体的な環境レコードのメソッドInitializeImmutableBindingは、引数 N という値から引数 V という値までの値である名称を持つ識別子の現在のバインディングのバインド値を設定する為に使用されます。 N における初期化されない恒久的なバインディングは既に存在していなければいけません。
1.envRecは実行されたメソッドにおける宣言型環境レコードとする 2.Assert:envRecは、初期化されない N という恒久的なバインディングを持たなければならない 3. V に envRec内の N というバインド値を設定 4. envRec内の N という恒久的なバインディングであるレコードは、初期化されている
各オブジェクト型環境レコードは、当該バインディング(結合)オブジェクトを呼ぶオブジェクトと関連付けされます。 オブジェクト型環境レコードは、当該バインディングオブジェクトの一致するプロパティ名をそのまま識別子名として設定します。 IdentifierNameではないプロパティ名は、バインド識別子の集合内には含まれません。 それ自身と継承したプロパティは共に、それらの[[Enumerable]]属性の設定に関わらず集合内に含まれます。 なぜならプロパティは、動的に追加されたり、オブジェクトから削除されたりすることが可能だからであり、オブジェクト型環境レコードによる識別子バインドの集合は、プロパティの追加または削除といった一部操作の副作用として潜在的に変更する場合があります。 このように副作用の結果として生成される一部のバインディングは、対応する値を持つプロパティのWritable属性が、falseである場合でさえ変更可能なバインディングになることが考えられます。 恒久的なバインディングは、オブジェクト型環境レコードにおいては存在しません。 オブジェクト型環境レコードは、関数呼び出しで使う為に暗黙のthis値としてそれらのバインディングオブジェクトを提供するように構成することができます。 この機能は、バインディングを誘発するWithステートメント(12.10)の動作を指定する為に使用されます。 その機能は、各オブジェクト型環境レコードごとに関連付けられるBoolean値provideThisによって操作されます。 既定では、provideThisの値は、いかなるオブジェクト型環境レコードにおいてもfalseです。 オブジェクト型環境レコードにおける具体的な仕様上のメソッドの動作は、次のアルゴリズムによって定義されます。
オブジェクト型環境レコードにおける具体的な環境レコードのメソッドHasBindingは、その関連付けたバインディングオブジェクトが引数 N という値である名称のプロパティを持つ場合に決まります。
1.envRecは、実行されたメソッドにおけるオブジェクト型環境レコードとする 2.bindingsは、envRecにおけるバインディングオブジェクトとする 3.プロパティ名として N を渡すことによってバインディングの[[HasProperty]]内部メソッドを呼ぶことで結果を返す
オブジェクト型環境レコードにおける具体的な環境レコードのメソッドCreateMutableBindingは、String型の値である名称を持つプロパティを環境オブジェクトの関連付けられたバインディングオブジェクト内で生成し、値undefinedに初期化します。 N と名付けたプロパティは、バインディングオブジェクト内に既に存在していてはいけません。 Boolean型の引数 D が提供され、値trueを持つ場合、新たなプロパティの[[Configurable]]属性はtrueに設定され、それ以外の場合にはfalseに設定されます。
1.envRecは、実行されたオブジェクト型環境レコードとする 2.bindingsは、envRecにおけるバインディングオブジェクトとする 3.Assert:プロパティ名 N と渡すことによってバインディングの[[HasProperty]]内部メソッドはfalse 4. D がtrueである場合には、configValueはtrueとし、それ以外の場合、configValueはfalseとする 5.バインディングの[[DefineOwnProperty]]内部メソッドを呼び、引数として N 、プロパティ記述子 {[[Value]]:undefined, [[Writable]]: true, [[Enumerable]]: true , [[Configurable]]: configValue} 、trueを渡す
オブジェクト型環境レコードにおける具体的な環境レコードのメソッドSetMutableBindingは、引数 N という値である名称を持つ環境レコードの関連付けられたバインディングオブジェクトのプロパティの値を引数 V という値に設定するべく試行します。 N と名付けたプロパティは、既に存在すべきですが、それが存在しなかったり、現在書き込み可能でない場合、エラー操作は、Boolean型引数 S という値によって決められます。
1.envRec実行されたメソッドにおけるオブジェクト型環境レコードとする 2.bindingsは、envRecにおけるバインディングオブジェクトとする 3.引数N, V, Sを伴うバインディングの[[Put]]内部メソッドを呼ぶ
オブジェクト型環境レコードにおける具体的な環境レコードのメソッドGetBindingValueは、識別子 N を引数としたString型の値である名称を持つその関連付けられたバインディングオブジェクトのプロパティの値を返します。 プロパティは、既に存在すべきですが、引数 S の値に依存する結果にならない場合、(以下のように評価されます。)
1.envRecは、実行されたオブジェクト型環境レコードとする 2.bindingsは、envRecにおけるバインディングオブジェクトとする 3.valueは、プロパティ名として N を渡すことによってバインディングの[[HasProperty]]内部メソッドを呼んだ結果とする 4.valueがfalseである場合には、 a. S がfalseである場合、値undefinedを返し、それ以外の場合、ReferenceError例外を投げる(スローする) 5.引数における N を渡すことによってバインディングの[[Get]]内部メソッドを呼ぶことで結果を返す
オブジェクト型環境レコードにおける具体的な環境レコードのメソッドDeleteBindingは、値trueを持つ[[Configurable]]属性を持つ環境オブジェクトのプロパティと一致するバインディングだけを削除することが可能です。
1.envRecは、実行されたメソッドにおけるオブジェクト型環境レコードとする 2.bindingsは、envRecにおけるバインディングオブジェクトとする 3.N と引数としてfalseを渡すことによってバインディングの[[Delete]]内部メソッドを呼ぶことで結果を返す
オブジェクト型環境レコードは、それらのprovideThisフラグがtrueである場合以外は、それらのImplicitThisValueとしてundefinedを返します。
1.envRecは、実行されたメソッドにおけるオブジェクト型環境レコードとする 2.envRecのprovideThisフラグがtrueである場合、envRecにおけるバインディングオブジェクトを返す 3.それ以外は、undefinedを返す
次の抽象操作は、語彙的な環境における操作についてのこの仕様内で使用されます。
抽象操作GetIdentifierReferenceは、語彙環境であるlex、識別子としてString型のname、Booleanフラグであるstrictを伴って呼ばれます。 lexの値は、nullとなる場合があります。 呼ばれる際、次のステップが実行されます。
1.lexがnull値である場合、 a.基準値が未定義、参照する名称がname、strict(厳格)モードフラグがstrictであるReference型の値を返す 2.envRecは、lexの環境レコードとする 3.引数 N としての名称を渡すことによってenvRecの具体的なメソッドHasBinding(N)を呼んだ結果とする 4.existsがtrueである場合、 a.基準値がenvRec、参照する名称がname、strict(厳格)モードフラグがstrictであるReference型の値を返す 5.それ以外の場合、 a. outerは、lexの外部環境参照の値とする b. 引数としてouter、name、strictを渡すことによってGetIdentifierReferenceを呼ぶことで結果を返す
抽象操作NewDeclarativeEnvironmentが、語彙環境や引数 E としてnullを伴って呼ばれる際には、次のステップが実行されます。
1.envは、新たな語彙環境とする 2.envRecは、バインディングを一切含まない新たに宣言する環境レコードとする 3.envの環境レコードはenvRecとして設定 4.envとしての外部の語彙的な環境参照に E を設定 5.envを返す
抽象操作NewObjectEnvironmentがオブジェクト O と引数として語彙環境 Eを伴って呼ばれる際には、次のステップが実行されます。
1.envは、新たなLexical Environmentとする 2.envRecは、バインディングオブジェクトとして O を含む新たなオブジェクト型環境レコードとする 3.envの環境レコードはenvRecとして設定 4.envの外部の語彙的な環境参照は E に設定 5.envを返す
グローバル環境は、ECMAScriptコードが実行される前に生成される一意の語彙環境です。 グローバル環境の環境レコードは、グローバルオブジェクト(15.1)であるバインディングオブジェクトを持つオブジェクト型環境レコードです。 グローバル環境の外部環境参照は、nullです。 ECMAScriptコードが実行される場合、オプションとしてプロパティがグローバルオブジェクトに追加され、初期プロパティが変更される場合があります。