厳密モードは ECMAScript 5 の新機能で、プログラム全体または特定の関数を「厳密な」動作コンテキストに置くことができます。この厳密なコンテキストにより、特定の操作が妨げられ、より多くの例外がスローされます。
ECMAScript 5 は ECMAScript 3 と下位互換性がありますが、厳密モードでは、ECMAScript 3 で非推奨となったすべての機能は互換性がなく無効になります (またはエラーがスローされます)。
厳密モードを有効にすると、次の利点があります:
1. いくつかのプログラミング エラーをキャッチし、例外をスローします。
2. 比較的「安全でない」操作 (グローバル変数へのアクセスなど) を防止し、例外をスローします。
3. いくつかの紛らわしい機能を無効にします。
厳密モードに関するほとんどの情報は、ES5 仕様 [PDF] の 223 ページに記載されています。
(注: ECMAScript 5 の厳密モードは Firefox の厳密モードとは異なります)
厳密モードを有効にする方法
スクリプト全体で厳密モードを有効にするには、プログラムの先頭に次のステートメントを追加します。
関数内で厳密モードを有効にする実際の応用例は、外部コードに影響を与えないように、厳密モード関数内で Javascript クラス ライブラリ全体を定義することです。
(関数(){
"厳密な使用";
// ライブラリを厳密に定義します...
})();
// 非厳密コード...
変数とプロパティ
未定義の変数への代入は、変数をグローバル変数にする代わりに失敗します。
書き込み可能なプロパティが false のプロパティを書き込むか、構成可能なプロパティが false のプロパティを削除するか、拡張可能なプロパティを false のプロパティで追加すると、エラーが発生します (これらのプロパティは事前に合意されています)。以前は、これらの操作は例外をスローせず、単にサイレントに失敗していました。
変数、関数、または関数パラメーターに対して削除操作を実行すると、エラーが発生します。
delete foo; // エラー
テストを削除; // エラー
関数 test2(arg) {
引数を削除; // エラー
}
評価
「eval」という名前の使用は禁止されています (主な目的は eval 関数が変数またはオブジェクトのプロパティを指すことです)。
関数
引数オブジェクトをオーバーライドするとエラーが発生します:
with() { } ステートメントは、厳密モードでは完全に壊れています。