このページはECMAScript® 2020 Language SpecificationC The Strict Mode of ECMAScript章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

Strict(厳密な)モードの制限と例外は、次のようになっています。

  • strictモードコードにおいて、implements、 interface、 let、 package、 private、 protected、 public、 static、 yieldは予約語です(11.6.2)
  • 準拠実装でstrictモードコードを処理する場合、B.1.1で説明されているように、NumericLiteralの構文を拡張してLegacyOctalIntegerLiteralを含めたり、DecimalIntegerLiteralの構文を拡張してNonOctalDecimalIntegerLiteralを含めることはできません。
  • 準拠実装でstrictモードコードを処理する場合、B.1.2 で説明されているように、EscapeSequenceの構文を拡張してLegacyOctalEscapeSequenceを含めることはできません。
  • strictモードコードで宣言されていない識別子またはその他の方法で解決できない参照にプロパティを割り当てようとしても、グローバルオブジェクトには割り当てできません。strictモードコード内で単純な割り当てが発生した場合、そのLeftHandSideExpressionは解決できない参照として評価してはいけません。実行すると、ReferenceError例外がスローされます(6.2.4.9
    )。 LeftHandSideExpressionは、属性値{ [[Writable]]: false }のデータプロパティ、属性値 { [[Set]]: undefined }のアクセサプロパティ、または[[Extensible]]内部スロットの値がfalseであるオブジェクト内に存在しないプロパティへの参照ではない場合もあります。 このような場合、TypeError例外がスローされます(12.15)。
  • StringValue"eval" または "arguments"IdentifierReferenceは、代入演算子(12.15)またはUpdateExpression12.4)のLeftHandSideExpressionとして、または前置インクリメント演算子(12.4.6)または前置デクリメント演算子(12.4.7)によって操作されるUnaryExpressionとして取り扱えない場合があります。
  • strict関数のargumentsオブジェクトは、アクセス時にTypeError例外をスローする構成不可能なアクセサプロパティ"callee"を定義します(9.4.4.6)。
  • strict関数のArgumentsオブジェクトの配列インデックスプロパティ値は、関数の対応する仮パラメーターバインディングと動的に共有されません。(9.4.4
  • strict関数でargumentsオブジェクトが作成された場合、argumentsオブジェクトへのローカル識別子引数のバインドは変更できないため、代入式のターゲットではない可能性があります。(9.2.10)。
  • strictモードコード内で、BindingIdentifierStringValue"eval" または"arguments"の場合はSyntaxErrorです。
  • strictモードコードのevalコードは、呼び出し元の変数環境で変数または関数をインスタンス化してevalすることはできません。 代わりに、新しい変数環境が作成され、その環境がevalコードの宣言バインディングのインスタンス化に使用されます。(18.2.1
  • thisstrictモードコード内で評価される場合、thisはオブジェクトに強制変換されません。 undefinedまたはnullthis値は、グローバルオブジェクトに変換されません。プリミティブ値はラッパーオブジェクトに変換されません。 関数呼び出し(Function.prototype.applyおよびFunction.prototype.callを使用して行われた呼び出しを含む)を介して渡されたthis値は、オブジェクトに強制変換されません。(9.2.1.219.2.3.119.2.3.3
  • strictモードコード内のdelete演算子において、そのUnaryExpressionが変数、関数引数、または関数名への直接参照である場合、SyntaxErrorがスローされます。(12.5.3.1
  • strictモードコード内のdelete演算子において、削除するプロパティの属性が{ [[Configurable]]: false }の場合、TypeErrorがスローされます。(12.5.3.2
  • strictモードコードのコードは、WithStatementを使用できません。 この場合、SyntaxError13.11.1)です。
  • strictモードコードで、CatchParameterBoundNamesevalまたはargumentsが含まれている場合は、SyntaxErrorです。(13.15.1
  • 同じBindingIdentifierstrict関数FormalParametersに複数回出現する場合は、SyntaxErrorです。 FunctionGeneratorAsyncFunctionコンストラクターを使用してこのような関数を作成しようとすると、SyntaxErrorです。(14.1.219.2.1.1.1
  • strict関数において、実装はこの仕様で定義されている、関数インスタンスの"caller" または "arguments"という名前のプロパティの意味を拡張することはできません。