"use strict";
JavaScriptのコードを「strict mode」で実行することを定義します。
The “use strict” Directive
"use strict"
ディレクティブは ECMAScript バージョン 5 で新たに導入されました。
これはステートメントではなく、以前のバージョンの JavaScript では無視されていたリテラル表現です。
"use strict"
の目的は、コードが「厳格なモード」で実行されるべきであることを示すことです。
厳格なモードでは、宣言されていない変数を使用することなどはできません。
Internet Explorer 9以下のブラウザを除き、すべてのモダンブラウザが “use strict “に対応しています。
Directive | |||||
---|---|---|---|---|---|
“use strict” | 13.0 | 10.0 | 4.0 | 6.0 | 12.1 |
表の中の数字は、ディレクティブを完全にサポートしている最初のブラウザのバージョンを示しています。
すべてのプログラムで厳格なモードを使用することができます。
"use strict"
は単なる文字列なので、IE 9 がそれを理解できなくてもエラーにはなりません。
ストリクトモードの宣言
スクリプトや関数の先頭に「use strict」;を追加することで、ストリクトモードを宣言します。
スクリプトの先頭に宣言することで、グローバル スコープになります(スクリプト内のすべてのコードがストリクトモードで実行されます):
例
x = 3.14; // これは x が宣言されていないため、エラーになります
Try it Yourself ”
Example
myFunction();
function myFunction() {
y = 3.14; // yが宣言されていないので、これもエラーになります
}
Try it Yourself ”
関数内で宣言されていると、ローカルスコープになります(関数内のコードのみがストリクトモードになります):
myFunction();
function myFunction() {
“use strict”;
y = 3.14; // これはエラーになります
}
Try it Yourself ”
The “use strict”; Syntax
ストリクトモードを宣言する構文は、古いバージョンの JavaScript と互換性があるように設計されています。
JavaScript のプログラムで数値リテラル (4 + 5;) や文字列リテラル (「John Doe」;) をコンパイルしても、副作用はありません。
だから、"use strict";
は、その意味を「理解」している新しいコンパイラにとってのみ重要なのです。
なぜ Strict Mode なのか?
Strict Mode は、「安全な」 JavaScript を簡単に書くことができます。
Strict Mode は、以前は受け入れられていた「悪い構文」を実際のエラーに変えます。
例として、通常の JavaScript では、変数名をミスタイプすると新しいグローバル変数が作成されます。
例えば、通常の JavaScript では、変数名をミスタイプすると新しいグローバル変数が作成されますが、ストリクト モードではこれがエラーになり、誤ってグローバル変数を作成することができなくなります。
通常の JavaScript では、書き込めないプロパティに値を代入しても、開発者はエラーのフィードバックを受け取りません。
ストリクト モードでは、書き込み不可能なプロパティ、ゲッターオンリーのプロパティ、存在しないプロパティ、存在しない変数、または存在しないオブジェクトへの代入は、エラーになります。
Strict Modeでは許されないこと
変数を宣言せずに使用することは許されません:
x = 3.14; // これはエラーになります
Try it Yourself “
オブジェクトも変数です。
オブジェクトを宣言せずに使用することは許されません:
x = {p1:10, p2:20}; // これはエラーになります
Try it Yourself “
変数(またはオブジェクト)を削除することは許されません。
var x = 3.14;
delete x; // これはエラーになります
Try it Yourself “
関数を削除することは許されません。
function x(p1, p2) {};
delete x; // これはエラーになります
Try it Yourself “
パラメータ名の重複は許されません。
function x(p1, p1) {}; // これはエラーになります
Try it Yourself “
10進数のリテラルは許されません。
var x = 010; // これはエラーになります
Try it Yourself “
Octal escape character is not allowed:
var x = “\010”; // これはエラーになります
Try it Yourself “
読み取り専用のプロパティへの書き込みは許可されていません:
var obj = {};
Object.defineProperty(obj, “x”, {value:0, writable:false});
obj.x = 3.14; // これはエラーになります
Try it Yourself “
get-only プロパティへの書き込みは許可されていません:
var obj = {get x() {return 0} };
obj.x = 3.14; // これはエラーになります
Try it Yourself”
削除できないプロパティを削除することは許されません:
delete Object.prototype; // これはエラーになります
Try it Yourself “
単語 eval
を変数として使用することはできません:
var eval = 3.14; // これはエラーになります
Try it Yourself “
単語 arguments
を変数として使用することはできません:
var arguments = 3.14; // これはエラーになります
Try it Yourself “
with
の記述は許可されていません。
with (Math){x = cos(2)}; // これはエラーになります
Try it Yourself “
セキュリティ上の理由から、eval()
が呼び出されたスコープで変数を作成することはできません。
eval (“var x = 2”);
alert (x); // これはエラーになります
Try it Yourself “
this
関数内のキーワードは、strictモードでは異なる動作をします。
this
キーワードは、関数を呼び出したオブジェクトを参照します。
オブジェクトが指定されていない場合、ストリクトモードの関数はundefined
を返し、ノーマルモードの関数はグローバルオブジェクト(window)を返します。
function myFunction() {
alert(this); // “undefined “を警告する
}
myFunction();
Try it Yourself”
Future Proof!
将来の JavaScript バージョンのために予約されたキーワードは、ストリクト モードでは変数名として使用できません。
以下のようになります。
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
var public = 1500; // これではエラーになってしまいます
Try it Yourself”
Watch Out!
“use strict “ディレクティブは、スクリプトや関数の先頭でのみ認識されます。