JavaScript Use Strict
"use strict";
JavaScriptコードを「strict(厳密)モード」で実行する必要があることを定義します。
「use strict」ディレクティブ
この"use strict"
ディレクティブは、ECMAScriptバージョン5で新しく追加されました。
これはステートメントではなくリテラル式であり、以前のバージョンのJavaScriptでは無視されます。
"use strict"
の目的は、コードを「厳密モード」で実行する必要があることを示します。
厳密モードでは、たとえば、宣言されていない変数を使用することはできません。
Internet Explorer9以前を除き、最新のブラウザーはすべて「use strict」をサポートしています。
Directive |
|||||
---|---|---|---|---|---|
"use strict" | 13.0 | 10.0 | 4.0 | 6.0 | 12.1 |
表内の数字は、ディレクティブを完全にサポートする最初のブラウザ バージョンを示しています。
すべてのプログラムで厳密モードを使用できます。宣言されていない変数の使用を防ぐなど、よりクリーンなコードを作成するのに役立ちます。"use strict"
は単なる文字列なので、IE9が理解できなくてもエラーにはなりません。
Strictモードの宣言
Strictモードは、スクリプトまたは関数の先頭に「use strict」を追加することで宣言されます。
スクリプトの先頭で宣言され、グローバルスコープを持ちます(スクリプト内のすべてのコードは厳密モードで実行されます)。
例
関数内で宣言され、ローカルスコープを持ちます(関数内のコードのみが厳密モードです)。
"use strict;"構文
厳密モードを宣言するための構文は、古いバージョンのJavaScriptと互換性があるように設計されています。
JavaScriptプログラムで数値リテラル(4+5;)または文字列リテラル("John Doe";)をコンパイルしても、副作用はありません。存在しない変数にコンパイルされて終了するだけです。
つまり"use strict";
は、その意味を「理解」する新しいコンパイラにとってのみ重要です。
厳密モードの理由
Strictモードを使用すると、「安全な」JavaScriptを簡単に記述できます。
Strictモードは、以前に受け入れられた「不適切な構文」を実際のエラーに変更します。
例として、通常のJavaScriptでは、変数名をタイプミスすると、新しいグローバル変数が作成されます。厳密モードでは、これによりエラーがスローされ、誤ってグローバル変数を作成することができなくなります。
通常のJavaScriptでは、書き込み不可のプロパティに値を割り当てても、開発者はエラーフィードバックを受け取りません。
厳密モードでは、書き込み不可のプロパティ、getterのみのプロパティ、存在しないプロパティ、存在しない変数、または存在しないオブジェクトへの割り当ては、エラーをスローします。
Strictモードでは許可されていません
変数を宣言せずに使用することは許可されていません。
オブジェクトも変数です。
宣言せずにオブジェクトを使用することは許可されていません。
変数(またはオブジェクト)の削除は許可されていません。
関数の削除は許可されていません。
パラメータ名の重複は許可されていません。
8進数リテラルは使用できません。
8進数のエスケープ文字は使用できません。
読み取り専用プロパティへの書き込みは許可されていません。
取得専用プロパティへの書き込みは許可されていません。
削除不可能なプロパティの削除は許可されていません:
単語をeval
変数として使用することはできません。
単語をarguments
変数として使用することはできません。
次のwith
ステートメントは許可されていません。
セキュリティ上の理由から、eval()
呼び出し元のスコープ内で変数を作成することはできません。
strictモードでは、 eval()はvar キーワードを使用して変数を宣言できません。
this
関数内のキーワードは、厳密モードでは異なる動作をします。
キーワードthis
は、関数を呼び出したオブジェクトを参照します。
オブジェクトが指定されていない場合、厳密モードの関数は戻りundefined
通常モードの関数は、グローバルオブジェクト(ウィンドウ)を返します。
将来性の保証!
将来のJavaScriptバージョン用に予約されているキーワードは、厳密モードでは変数名として使用できません。
これらは:
・implements
・interface
・let
・package
・private
・protected
・public
・static
・yield
注意!
「use strict」ディレクティブは、スクリプトまたは関数の先頭でのみ認識されます。
プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。