訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
リファレンス(参照)の型は、delete、typeof、代入(assignment)演算子( = , op= )のような演算子としての振る舞いを説明する為に使用されます。 例えば、assignmentの左辺のオペランドは、リファレンスを生成することが期待されます。 assignmentの動作は、代わりにassignment演算子の左辺のオペランドを構成する構文上の書式におけるケース解析という目的において全て説明されますが、ただ1つだけ困難なのは、関数呼び出しが、リファレンスを返す為に実行されることです。 この可能性は、単にホストオブジェクトの為に認められています。 リファレンスを返す当該仕様によって定義した非組み込みECMAScript関数とリファレンスを返す為のユーザー定義関数についての規定はありません。 (長くて不恰好である構文上のケース解析を利用しない他の理由としては、当該仕様の多くの部分に影響を与えるからです。) リファレンスは名称の関連付けにより解決されます。 リファレンスは、 base (基準)値、リファレンス名、Boolean値である strict reference (厳格リファレンス)フラグという3つのコンポーネントから構成されます。 基準値は、undefined、Object、Boolean、String、Numberか、または環境レコード(environment record ( 10.2.1 ) )の何れかです。 undefined(未定義)という基準値は、関連付けを解決されることができないリファレンスを示します。 リファレンス名は、文字列です。 次の抽象操作は、リファレンスを構成するコンポーネントにアクセスする為に当該仕様内で使用されます。
次の抽象操作は、リファレンスにおける操作について当該仕様内で使用されます。
1. Type(V)がReferenceでない場合に V を返す 2. base は、GetBase(V)を呼んだ結果とする 3. IsUnresolvableReference(V)が真である場合、ReferenceError (参照エラー)例外を投げる(スローする) 4. IsPropertyReference(V)が真である場合、 a. HasPrimitiveBase(V)が、false である場合、get は、 base の内部メソッド[[Get]]とし、それ以外の場合、get は、以下に定義した特殊な[[Get]]内部メソッドとする b. その this 値として base を使用、引数にGetReferencedName(V)を渡すことによって内部メソッド get を呼んだ結果を返す 5.その他の場合には、 base は環境レコード(environment record)にしなければならない。 a. 引数としてGetReferencedName(V) と IsStrictReference(V)を渡して base の具体的なメソッドである GetBindingValue ( 10.2.1 参照)を呼んだ結果を返す。
次の[[Get]]内部メソッドは、 V がプリミティブ(原始的)な基準値を伴うプロパティ参照である場合にGetValueによって使用されます。 その引数としてプロパティPを伴う、その this 値としての base を使用することで呼ばれます。 次のステップが取られます。
1. O は、ToObject(base)とする 2. desc は、プロパティ名 P を伴う O の内部メソッド[[GetProperty]]を呼んだ結果とする 3. desc が、undefined(未定義)である場合、undefinedを返す 4. IsDataDescriptor(desc) が、trueである場合、desc.[[Value]]を返す。 5. それ以外の場合、IsAccessorDescriptor(desc) は、trueにしなければならない為、getter(取得メソッド)は、desc.[[Get]] とする( 8.10 参照) 6. getter が、undefined(未定義)である場合、undefinedを返す 7. this 値として base を提供し、提供する引数が何もない getter の[[Call]]内部メソッドを呼んだ結果を返す
[注釈] ステップ1で生成される可能性のあるオブジェクトは、上記メソッドの外からアクセスすることはできません。 実装は、当該オブジェクトの実際の生成を回避する選択をする場合もあります。 視覚的な効果を与えることが可能なこの内部メソッドを使う実際のプロパティアクセスのような限定的な状況というのは、アクセサ関数を呼び出す時です。
1. Type(V)がReferenceでない場合、ReferenceError(参照エラー)例外を投げる(スローする) 2. base は、GetBase(V)を呼んだ結果とする 3. IsUnresolvableReference(V)が真である場合、 a. IsStrictReference(V) が true である場合 i. ReferenceError(参照エラー)例外を投げる(スローする) b. プロパティ名として GetReferencedName(V) 、値として W 、Throwフラグとして false を渡すことによってグローバルオブジェクトとして[[Put]]内部メソッドを呼ぶ 4. IsPropertyReference(V)が真である場合、 a. HasPrimitiveBase(V)が、falseである場合、put は、base の内部メソッド[[Put]]とし、それ以外の場合、put は、以下に定義した特殊な内部メソッド[[Put]]とする b. その this 値 として base を使用し、プロパティ名としてGetReferencedName(V)、値として W 、Throwフラグとして IsStrictReference(V)を渡すことによって内部メソッド put を呼ぶ 5. 何れでもない場合には、base は、基準が環境レコード(environment record)であるリファレンスにしなければならない為、 a. GetReferencedName(V)、(値は) W 、引数としてIsStrictReference(V)を渡すことによって base の具体的なメソッドであるSetMutableBinding( 10.2.1 )を呼ぶ 6. Return
次の[[Put]]内部メソッドは、V が、プリミティブ(原始的)な基準値を伴うプロパティのリファレンスである場合にPutValueによって使用されます。 引数としてプロパティ P、値 W 、Booleanフラグ Throw を伴う、その this 値としての base を使って呼ばれます。 次のステップが取られます。
1. O は、ToObject(base)とする 2. 引数 P を伴う O の内部メソッド[[CanPut]]を呼んだ結果が、false である場合、 a. Throwが、trueである場合、TypeError例外を投げる(スローする) b. それ以外の場合、return 3. ownDescは、引数 P を伴う O の内部メソッド[[GetOwnProperty]]を呼んだ結果とする 4. IsDataDescriptor(ownDesc)が、trueである場合、 a. Throwが、trueである場合、TypeError例外を投げる(スローする) b. それ以外の場合、return 5. descは、引数 P を伴う O の内部メソッド[[GetOwnProperty]]を呼んだ結果とする。これは、それ自身、継承したアクセサプロパティ、または、継承したデータプロパティ記述子の何れかとなる場合があります。 6. IsAccessorDescriptor(desc)が、trueである場合、 a. setter(設定メソッド)は、undefinedにすることができないdesc.[[Set]] ( 8.10 参照) とする b. this 値として base と W のみを含んだ引数リストを提供する setter の内部メソッド[[Call]]を呼ぶ 7. それ以外の場合、一時的なオブジェクト O について自身のプロパティを生成する為に要求される a. Throwが、trueである場合、TypeError例外を投げる(スローする) 8. Return
[注釈] ステップ1で生成される場合があるオブジェクトは、上記メソッドの外からアクセスすることはできません。 実装は、一時的なオブジェクトとしての実際の生成を回避する選択をする可能性があります。 視覚的な効果を与えることが可能なこの内部メソッドを使う実際のプロパティの関連付けのような限定的な状況というのは、アクセサ関数を呼び出す時か、または、任意のエラーチェックを含意した Throw の違反であるかの何れかです。 Throwがtrueである場合には、一時的なオブジェクトについて新たなプロパティを生成するであろういかなるプロパティの関連付けについてもエラーを投げ(スローし)ます。