JavaScript Use Strict
"use strict";
JavaScriptコードを「厳密モード」で実行する必要があることを定義します。
「厳密な使用」指令
この"use strict"
ディレクティブは、ECMAScriptバージョン5で新しく追加されました。
これはステートメントではなく、以前のバージョンのJavaScriptでは無視されていたリテラル式です。
の目的は"use strict"
、コードを「厳密モード」で実行する必要があることを示すことです。
strictモードでは、たとえば、宣言されていない変数を使用することはできません。
Internet Explorer 9以下を除き、最新のブラウザはすべて「厳密に使用」をサポートしています。
Directive | |||||
---|---|---|---|---|---|
"use strict" | 13.0 | 10.0 | 4.0 | 6.0 | 12.1 |
表の数字は、ディレクティブを完全にサポートする最初のブラウザーバージョンを示しています。
すべてのプログラムで厳密モードを使用できます。宣言されていない変数を使用できないようにするなど、よりクリーンなコードを作成するのに役立ちます。
"use strict"
は単なる文字列であるため、IE9はそれを理解していなくてもエラーをスローしません。
厳密モードの宣言
厳密モードは、「usestrict」を追加することで宣言されます。スクリプトまたは関数の先頭まで。
スクリプトの先頭で宣言され、グローバルスコープがあります(スクリプト内のすべてのコードは厳密モードで実行されます)。
例
"use strict";
x = 3.14; // This will cause an error
because x is not declared
例
"use strict";
myFunction();
function myFunction() {
y = 3.14; // This will also cause an error
because y is not declared
}
関数内で宣言され、ローカルスコープがあります(関数内のコードのみが厳密モードになっています)。
x = 3.14; // This will not cause an error.
myFunction();
function
myFunction() {
"use strict";
y = 3.14; // This will cause an error
}
「厳密に使用する」; 構文
厳密モードを宣言するための構文は、古いバージョンのJavaScriptと互換性があるように設計されています。
JavaScriptプログラムで数値リテラル(4 + 5;)または文字列リテラル( "John Doe";)をコンパイルしても、副作用はありません。それは単に存在しない変数にコンパイルされて死にます。
したがって"use strict";
、その意味を「理解」する新しいコンパイラにとってのみ重要です。
なぜ厳密モードなのか?
厳密モードを使用すると、「安全な」JavaScriptを簡単に作成できます。
厳密モードでは、以前に受け入れられていた「不正な構文」が実際のエラーに変更されます。
例として、通常のJavaScriptでは、変数名を誤って入力すると、新しいグローバル変数が作成されます。厳密モードでは、これによりエラーがスローされ、誤ってグローバル変数を作成することはできなくなります。
通常のJavaScriptでは、開発者は書き込み不可能なプロパティに値を割り当てるエラーフィードバックを受け取りません。
厳密モードでは、書き込み不可のプロパティ、ゲッターのみのプロパティ、存在しないプロパティ、存在しない変数、または存在しないオブジェクトへの割り当てはエラーをスローします。
厳密モードでは許可されていません
変数を宣言せずに使用することは許可されていません。
"use strict";
x = 3.14; // This will cause an error
オブジェクトも変数です。
オブジェクトを宣言せずに使用することは許可されていません。
"use strict";
x = {p1:10, p2:20}; // This will cause an error
変数(またはオブジェクト)の削除は許可されていません。
"use strict";
let x = 3.14;
delete x; // This
will cause an error
関数を削除することはできません。
"use strict";
function x(p1, p2) {};
delete x;
// This will cause an error
パラメータ名を複製することは許可されていません。
"use strict";
function x(p1, p1) {}; // This will cause an error
8進数のリテラルは使用できません。
"use strict";
let x = 010; // This
will cause an error
8進数のエスケープ文字は使用できません。
"use strict";
let x = "\010"; // This will cause an error
読み取り専用プロパティへの書き込みは許可されていません。
"use strict";
const obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // This
will cause an error
get-onlyプロパティへの書き込みは許可されていません。
"use strict";
const obj = {get x()
{return 0} };
obj.x = 3.14; // This
will cause an error
削除できないプロパティを削除することはできません。
"use strict";
delete Object.prototype; // This will cause an error
この単語eval
を変数として使用することはできません。
"use strict";
let eval = 3.14; // This will cause an error
この単語arguments
を変数として使用することはできません。
"use strict";
let arguments = 3.14; // This will cause an error
with
ステートメントは許可されていません:
"use strict";
with (Math){x = cos(2)}; // This will cause an error
セキュリティ上の理由から、eval()
呼び出し元のスコープに変数を作成することは許可されていません。
"use strict";
eval ("let x = 2");
alert (x); // This
will cause an error
関数のthis
キーワードは、厳密モードでは動作が異なります。
this
キーワードは、関数を呼び出したオブジェクトを参照します。
オブジェクトが指定されていない場合、厳密モードのundefined
関数は戻り、通常モードの関数はグローバルオブジェクト(ウィンドウ)を返します。
"use strict";
function myFunction() {
alert(this); // will alert "undefined"
}
myFunction();
将来の保証!
将来のJavaScriptバージョン用に予約されているキーワードは、厳密モードでは変数名として使用できません。
これらは:
- 実装
- インターフェース
- させて
- パッケージ
- 民間
- 保護
- 公衆
- 静的
- 収率
"use strict";
let public = 1500; // This will cause an error
気を付けて!
「usestrict」ディレクティブは、スクリプトまたは関数の先頭でのみ認識されます。