JavaScript 厳格モード

"use strict"; JavaScript コードが「厳格モード」で実行されるべきことを定義します。

"use strict" 指令

"use strict" これは JavaScript 1.8.5 で導入された新しい指令(ECMAScript バージョン 5)です。

それは一文ではありませんが、文字列式表現であり、より古いバージョンの JavaScript はそれを無視します。

"use strict"; これは JavaScript コードが「厳格モード」で実行されるべき指示として機能します。

厳格モードでは、例えば未宣言の変数を使用することができません。

以下のバージョンのブラウザが厳格モードをサポートしています:

  • バージョン 10 以降の IE
  • バージョン 4 以降の Firefox
  • バージョン 13 以降の Chrome
  • バージョン 5.1 以降の Safari
  • バージョン 12 以降の Opera

厳格モードを宣言する

スクリプトや関数の先頭に追加することで "use strict"; 厳格モードを宣言するために

スクリプトの先頭で宣言すると、グローバルスコープを持つ(スクリプト内のすべてのコードが厳格モードで実行されます):

"use strict";
x = 3.14;       // これはエラーを引き起こします、なぜなら x はまだ宣言されていないからです

実際に試してみてください

"use strict";
myFunction();
function myFunction() {
     y = 3.14;   // これはエラーを引き起こします、なぜなら y はまだ宣言されていないからです
}

実際に試してみてください

関数内で厳格モードを宣言し、ローカルスコープを持つ(関数内のコードのみが厳格モードで実行されます):

x = 3.14;       // これはエラーを引き起こしません
myFunction();
function myFunction() {
	"use strict";
	 y = 3.14;   // これはエラーを引き起こします
}

実際に試してみてください

"use strict" 文法

厳格モードの文法は、より古いバージョンの JavaScript と互換性を持たせるように設計されています。

JavaScript プログラムの数値テキスト(例えば 4+5)や文字列テキスト("Bill Gates")をコンパイルするには、悪い影響はありません。それは存在しない変数としてコンパイルされ、消えます。

すべて "use strict"; 新しいコンパイラのみがその意味を「理解」できます。

厳密モードを使う理由は何ですか?

厳密モードで「安全な」JavaScriptをより簡単に書くことができます。

厳密モードでは、以前許可されていた「悪い構文」を実際のエラーに変えます。

例えば、通常のJavaScriptでは、変数名を間違えて打ち間違えた場合、新しいグローバル変数が作成されます。厳密モードでは、この行為がエラーとして投げられ、グローバル変数が意図せず作成されることがありません。

通常のJavaScriptでは、不可書き属性への値の設定を行った場合、開発者にはエラーフィードバックが得られません。

厳密モードでは、不可書き属性、読み取り専用の属性、存在しない属性への値の設定、または存在しない変数やオブジェクトへの値の設定が行われた場合、エラーが投げられます。

厳密モードで許可されていないこと

変数を使用する場合、変数を宣言する必要があります:

"use strict";
x = 3.14;                // エラーが発生します

実際に試してみてください

オブジェクトも変数です

オブジェクトを使用する場合、オブジェクトを宣言する必要があります:

"use strict";
x = {p1:10, p2:20};      // エラーが発生します

実際に試してみてください

変数(またはオブジェクト)の削除は許可されていません:

"use strict";
var x = 3.14;
delete x;                // エラーが発生します

実際に試してみてください

関数の削除は許可されていません:

"use strict";
function x(p1, p2) {}; 
delete x;                 // エラーが発生します

実際に試してみてください

重複する引数名は許可されていません:

"use strict";
function x(p1, p1) {};   // エラーが発生します

実際に試してみてください

8進数のテキストは許可されていません:

"use strict";
var x = 010;             // エラーが発生します

実際に試してみてください

エスケープシーケンスは許可されていません:

"use strict";
var x = \010;            // エラーが発生します

実際に試してみてください

読み取り専用の属性への書き込みは許可されていません:

"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14;            // エラーが発生します

実際に試してみてください

読み取り専用の属性への書き込みは許可されていません:

"use strict";
var obj = {get x() {return 0} };
obj.x = 3.14;            // エラーが発生します

実際に試してみてください

削除できない属性の削除は許可されていません:

"use strict";
delete Object.prototype; // エラーが発生します

実際に試してみてください

文字列「eval」は変数として使用できません:

"use strict";
var eval = 3.14;         // エラーが発生します

実際に試してみてください

文字列「arguments」は変数として使用できません:

"use strict";
var arguments = 3.14;    // これがエラーを引き起こします

実際に試してみてください

with 以下の文は許可されていません:

"use strict";
with (Math){x = cos(2)}; // これがエラーを引き起こします

実際に試してみてください

セキュリティの観点から、以下は許可されていません eval() その呼び出されたスコープで変数を作成します:

"use strict";
eval ("var x = 2");
alert (x);               // これがエラーを引き起こします

実際に試してみてください

f() などの関数呼び出しの際に、this の値はグローバルオブジェクトです。厳密モードでは、今やこれは undefined

将来の保証

厳密モードでは将来のために保留されているキーワードを使用することは許可されていません。これらは:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
"use strict";
var public = 1500;      // これがエラーを引き起こします

実際に試してみてください

警告

"use strict" 指示はスクリプトや関数の開始認識されました。