10.1 ソーステキスト(Source Text)
構文
ECMAScriptコードはUnicodeを使用して表現されます。 ECMAScriptのソーステキストは、一連のコードポイントです。 サロゲートコードポイントを含む U+0000 から U+10FFFF までのすべてのUnicodeコードポイント値が、ECMAScript文法で許可されているソーステキストで使用される可能性があります。 ECMAScriptソーステキストのファイル形式や、データのやりとりなどに使用される実際のエンコーディングは、この仕様には関係ありません。 ECMAScriptの準拠実装は、外部ソーステキストのエンコードに関係なく、ソーステキストをSourceCharacter値の同等のシーケンスであるかのように処理します。各SourceCharacterはUnicodeコードポイントです。 ECMAScriptの適合実装は、ソーステキストの正規化を実行したり、ソーステキストの正規化を実行しているかのように動作する必要はありません。
ユーザーがシーケンス全体を単一の文字と見なしても、結合文字シーケンスのコンポーネントは個別のUnicodeコードポイントとして扱われます。
10.1.1 静的セマンティクス(Static Semantics): UTF16Encoding ( cp )
数値コードポイント値cpのUTF16Encodingは、次のように決定されます。
10.1.2 静的セマンティクス(Static Semantics): UTF16Encode ( text )
6.1.4で説明されているように、この抽象演算は、Unicodeコードポイントのシーケンスである textを文字列値に変換します。
- text内の各コードポイントにUTF16Encodingを適用し、結果を順番に文字列連結して返す。
10.1.3 静的セマンティクス(Static Semantics): UTF16DecodeSurrogatePair ( lead, trail )
UTF-16サロゲートペアを形成する2つのコードユニット、leadと trailは、次の手順を実行することによってコードポイントに変換されます。
10.1.4 静的セマンティクス(Static Semantics): CodePointAt ( string, position )
抽象演算CodePointAtは、6.1.4で説明されているように、文字列stringをUTF-16エンコードされたコードポイントのシーケンスとして解釈し、インデックスpositionのコードユニットで始まる単一のコードポイントを読み取ります。 呼び出されると、次の手順が実行されます。
- string の長さ を size とする
- Assert: position ≧ 0 で position < size
- string の インデックスposition にあるコードユニットを first とする
- first の数値(コードポイント)を cp とする
- first が 上位サロゲート と 下位サロゲート 以外なら、
- Record型 { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false }を返す
- first が 下位サロゲート または、 position + 1 = size なら、
- Record型 { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }を返す
- string の インデックスposition + 1 のコードユニット を second とする
- second が 下位サロゲート でないなら、
- Record型 { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }を返す
- ! UTF16DecodeSurrogatePair(first, second) を cp にセットする
- Record型 { [[CodePoint]]: cp, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false }を返す
10.1.5 静的セマンティクス(Static Semantics): UTF16DecodeString ( string )
この抽象操作は文字列値stringを、6.1.4で説明されているようにUTF-16エンコードされたUnicodeテキストとして解釈し、その結果として得られるUnicodeコードポイントのシーケンスを返します。
- 空の新規List を codePoints とする
- string の長さを size とする
- 0 を position とする
- position < size の間繰り返し
- ! CodePointAt(string, position) を cp とする
- codePoints に cp.[[CodePoint]] を追加
- position + cp.[[CodeUnitCount]] を position にセットする
- codePointsを返す
10.2 ソースコードの種類(Types of Source Code)
ECMAScriptコードには4つの種類があります。
-
グローバルコード
グローバルコードは、ECMAScriptスクリプトとして扱われるソーステキストです。 特定のスクリプトのグローバルコードには、FunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、AsyncFunctionDeclaration、AsyncFunctionExpression、AsyncGeneratorDeclaration、AsyncGeneratorExpression、MethodDefinition、ArrowFunction、AsyncArrowFunction、ClassDeclaration、ClassExpression
の一部として解析されるソーステキストは含まれません。 -
Evalコード
Evalコードは、組み込みのeval関数に提供されるソーステキストです。 より正確には、eval関数の引数が文字列の場合、ECMAScriptスクリプトとして扱われます。 evalの特定の呼び出しのevalコードは、そのスクリプトのグローバルコード部分です。
-
関数コード
関数コードは、ECMAScript関数オブジェクトの[[ECMAScriptCode]]と[[FormalParameters]]内部スロット(9.2を参照)の値を提供するために解析されるソーステキストです。 特定のECMAScript関数の関数コードには、ネストされたFunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、AsyncFunctionDeclaration、AsyncFunctionExpression、AsyncGeneratorDeclaration、AsyncGeneratorExpression、MethodDefinition、ArrowFunction、AsyncArrowFunction、ClassDeclaration、ClassExpressionの関数コードとして解析されるソーステキストは含まれません 。
- FunctionDeclarationまたはFunctionExpression の FormalParametersおよびFunctionBody
- GeneratorDeclarationまたはGeneratorExpression の FormalParametersおよびGeneratorBody
- AsyncFunctionDeclarationまたはAsyncFunctionExpression の FormalParametersおよびAsyncFunctionBody
- AsyncGeneratorDeclarationまたはAsyncGeneratorExpression の FormalParametersおよびAsyncGeneratorBody
-
モジュールコード
モジュールコードは、ModuleBodyとして提供されるコードであるソーステキストです。 モジュールの初期化時に直接評価されます。 特定のモジュールのモジュールコードには、ネストされたFunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、AsyncFunctionDeclaration、AsyncFunctionExpression、AsyncGeneratorDeclaration、AsyncGeneratorExpression、MethodDefinition
ArrowFunction、AsyncArrowFunction
ClassDeclaration、ClassExpression
の一部として解析されるソーステキストは含まれません。
さらに、上記のソーステキストが次のように解析された場合:
次に、その宣言または式のBindingIdentifier(存在する場合)に一致するソーステキストも、対応する関数の関数コードに含まれます。
10.2.1 strictモードコード(Strict Mode Code)
ECMAScriptスクリプト構文ユニットは、無制限モードまたはStrict(厳密)モードの構文とセマンティクスを使用して処理されます。 次の状況では、コードはstrictモードコードとして解釈されます。
- Use Strictディレクティブを含むディレクティブプロローグで始まる場合、グローバルコードはstrictモードコードです。
- モジュールコードは常にstrictモードコードです。
- ClassDeclarationまたはClassExpressionのすべての部分は、strictモードコードです。
- Evalコードが、Use Strictディレクティブを含むディレクティブプロローグで始まる場合、またはevalの呼び出しがstrictモードコードに含まれるダイレクトevalである場合、strictモードコードです。
- 関連付けられたFunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、AsyncFunctionDeclaration、AsyncFunctionExpression、AsyncGeneratorDeclaration、AsyncGeneratorExpression、MethodDefinition、ArrowFunction、AsyncArrowFunctionがStrictモードコードに含まれている場合、または関数の[[ ECMAScriptCode]]内部スロットの値を生成するコードがUse Strictディレクティブを含むディレクティブプロローグで始まる場合、関数コードはstrictモードコードです。
- 組み込みのFunction、Generator、AsyncFunction、およびAsyncGeneratorのコンストラクターの引数として提供される関数コードは、最後の引数が、処理時にUse Strictディレクティブを含むディレクティブプロローグで始まるFunctionBodyの場合、strictモードコードです。
非strictコード
strictモードコードではないECMAScriptコードは、非strict(non-strict)コードと呼ばれます。
10.2.2 非ECMAScript関数(Non-ECMAScript Functions)
ECMAScript実装は、ECMAScriptコードではない実行可能な実装定義形式の関数エキゾチックオブジェクト評価をサポートする場合があります。 関数オブジェクトがECMAScriptコード関数であるか非ECMAScript関数であるかを、非ECMAScript関数を呼び出したり、呼び出されたりするECMAScriptコード関数からは判断できません。
ECMAScriptは、Unicodeエスケープシーケンスの動作がJavaプログラミング言語と異なります。たとえば、Javaプログラムでは、Unicodeエスケープシーケンス\u000Aが単一行コメント内にあると、行末記号として解釈されます(UnicodeコードポイントU+000AはLINE FEED(LF))。したがって、次のコードポイントはコメントの一部ではありません。同様に、Unicodeエスケープシーケンス\u000AがJavaプログラムの文字列リテラル内にあると、行終了文字として解釈されます。これは文字列リテラル内では許可されまていません。LINEFEED(LF)が文字列リテラルの文字列値の一部になるようにするには、\u000Aの代わりに\nを記述する必要があります。ECMAScriptプログラムでは、コメント内のUnicodeエスケープシーケンスは解釈されないため、コメントの終了に影響しません。同様に、ECMAScriptプログラムの文字列リテラル内のUnicodeエスケープシーケンスは常にリテラルに影響します。ただし文字列リテラルを終了させる行終端記号またはコードポイントとして解釈されることはありません。