Articles

JavaScript Use Strict

Posted on

"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」;を追加することで、ストリクトモードを宣言します。

スクリプトの先頭に宣言することで、グローバル スコープになります(スクリプト内のすべてのコードがストリクトモードで実行されます):

「use strict」;
x = 3.14; // これは x が宣言されていないため、エラーになります

Try it Yourself ”

Example

“use strict”;
myFunction();
function myFunction() {
y = 3.14; // yが宣言されていないので、これもエラーになります
}

Try it Yourself ”

関数内で宣言されていると、ローカルスコープになります(関数内のコードのみがストリクトモードになります):

x = 3.14; // これはエラーになりません。
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では許されないこと

変数を宣言せずに使用することは許されません:

“use strict”;
x = 3.14; // これはエラーになります

Try it Yourself “

オブジェクトも変数です。

オブジェクトを宣言せずに使用することは許されません:

“use strict”;
x = {p1:10, p2:20}; // これはエラーになります

Try it Yourself “

変数(またはオブジェクト)を削除することは許されません。

“use strict”;
var x = 3.14;
delete x; // これはエラーになります

Try it Yourself “

関数を削除することは許されません。

“use strict”;
function x(p1, p2) {};
delete x; // これはエラーになります

Try it Yourself “

パラメータ名の重複は許されません。

“use strict”;
function x(p1, p1) {}; // これはエラーになります

Try it Yourself “

10進数のリテラルは許されません。

“use strict”;
var x = 010; // これはエラーになります

Try it Yourself “

Octal escape character is not allowed:

“use strict”;
var x = “\010”; // これはエラーになります

Try it Yourself “

読み取り専用のプロパティへの書き込みは許可されていません:

“use strict”;
var obj = {};
Object.defineProperty(obj, “x”, {value:0, writable:false});
obj.x = 3.14; // これはエラーになります

Try it Yourself “

get-only プロパティへの書き込みは許可されていません:

“use strict”;
var obj = {get x() {return 0} };
obj.x = 3.14; // これはエラーになります

Try it Yourself”

削除できないプロパティを削除することは許されません:

“use strict”;
delete Object.prototype; // これはエラーになります

Try it Yourself “

単語 eval を変数として使用することはできません:

“use strict”;
var eval = 3.14; // これはエラーになります

Try it Yourself “

単語 arguments を変数として使用することはできません:

“use strict”;
var arguments = 3.14; // これはエラーになります

Try it Yourself “

withの記述は許可されていません。

“use strict”;
with (Math){x = cos(2)}; // これはエラーになります

Try it Yourself “

セキュリティ上の理由から、eval()が呼び出されたスコープで変数を作成することはできません。

“use strict”;
eval (“var x = 2”);
alert (x); // これはエラーになります

Try it Yourself “

this 関数内のキーワードは、strictモードでは異なる動作をします。

this キーワードは、関数を呼び出したオブジェクトを参照します。

オブジェクトが指定されていない場合、ストリクトモードの関数はundefinedを返し、ノーマルモードの関数はグローバルオブジェクト(window)を返します。

“use strict”;
function myFunction() {
alert(this); // “undefined “を警告する
}
myFunction();

Try it Yourself”

Future Proof!

将来の JavaScript バージョンのために予約されたキーワードは、ストリクト モードでは変数名として使用できません。

以下のようになります。

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
“use strict”。
var public = 1500; // これではエラーになってしまいます

Try it Yourself”

Watch Out!

“use strict “ディレクティブは、スクリプトや関数の先頭でのみ認識されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です