サーチ…
構文
- 'use strict';
- "厳密に使う";
- `use strict`;
備考
Strictモードは、ECMAScript 5でいくつかの後方互換性のない拡張を可能にするために追加されたオプションです。 「厳密モード」コードの動作の変更には、次のものがあります。
- 未定義の変数に代入すると、新しいグローバル変数を定義する代わりにエラーが発生します。
- 書き込み不能なプロパティ(
window.undefined
など)に割り当てたり削除したりすると、サイレント実行ではなくエラーが発生します。 - レガシオクタル構文(例:
0777
)はサポートされていません。 -
with
文はサポートされていません。 -
eval
は周囲のスコープに変数を作成することはできません。 - 関数の
.caller
プロパティと.arguments
プロパティはサポートされていません。 - 関数のパラメータリストには重複はありません。
-
window
は自動的にthis
値として使用されなくなりました。
注 : - 厳密でないモードの機能に依存するJavaScriptをページが使用している場合、そのコードが壊れるように、 ' strict 'モードはデフォルトでは有効になっていません。したがって、それはプログラマ自身によってオンにされなければならない。
スクリプト全体
Strictモードは、ステートメント"use strict";
置くことでスクリプト全体に適用できます"use strict";
他の声明の前に。
"use strict";
// strict mode now applies for the rest of the script
Strictモードは、 "use strict"
を定義するスクリプトでのみ有効になります。厳密な状態は異なるスクリプト間で共有されないため、厳密なモードの有無にかかわらずスクリプトを組み合わせることができます。
関数の場合
Strictモードは、 "use strict";
前置することによって単一の関数に適用することもでき"use strict";
関数宣言の冒頭にある文。
function strict() {
"use strict";
// strict mode now applies to the rest of this function
var innerFunction = function () {
// strict mode also applies here
};
}
function notStrict() {
// but not here
}
厳密なモードは、スコープ内の任意の関数にも適用されます。
グローバルプロパティへの変更
非strictモードのスコープでは、変数がvar
、 const
またはlet
キーワードで初期化されずに割り当てられると、自動的にグローバルスコープで宣言されます。
a = 12;
console.log(a); // 12
ただし、厳密なモードでは、宣言されていない変数へのアクセスは参照エラーをスローします。
"use strict";
a = 12; // ReferenceError: a is not defined
console.log(a);
これは、JavaScriptが予期しない可能性のあるいくつかのイベントを持っているので便利です。厳密ではないモードでは、これらのイベントにより、開発者はバグや予期しない動作であると信じることが多いため、厳格モードを有効にすることにより、スローされたエラーによって何が行われているのかを正確に知るよう強制されます。
"use strict";
// Assuming a global variable mistypedVariable exists
mistypedVaraible = 17; // this line throws a ReferenceError due to the
// misspelling of variable
厳密なモードのこのコードは、1つの可能なシナリオを表示します。つまり、割り当ての行番号を指す参照エラーがスローされ、開発者は変数名のミスタイプをすぐに検出できます。
非strictモードでは、エラーがスローmistypedVaraible
、割り当てが正常に行われたことに加えて、 mistypedVaraible
はグローバル変数としてグローバルスコープ内で自動的に宣言されます。これは、コード内のこの特定の割り当てを開発者が手作業で調べる必要があることを意味します。
さらに、変数の宣言を強制することで、開発者は誤ってグローバル変数を関数内で宣言することはできません。非厳密モードでは:
function foo() {
a = "bar"; // variable is automatically declared in the global scope
}
foo();
console.log(a); // >> bar
strictモードでは、変数を明示的に宣言する必要があります。
function strict_scope() {
"use strict";
var a = "bar"; // variable is local
}
strict_scope();
console.log(a); // >> "ReferenceError: a is not defined"
変数は、関数の外側と後に宣言することもできます。たとえば、グローバルスコープで使用することができます。
function strict_scope() {
"use strict";
a = "bar"; // variable is global
}
var a;
strict_scope();
console.log(a); // >> bar
プロパティの変更
Strictモードでは、削除不能なプロパティを削除することもできません。
"use strict";
delete Object.prototype; // throws a TypeError
厳密なモードを使用しない場合、上記のステートメントは無視されますが、なぜそれが期待どおりに実行されないのかがわかります。
また、非拡張可能なプロパティを拡張することもできません。
var myObject = {name: "My Name"}
Object.preventExtensions(myObject);
function setAge() {
myObject.age = 25; // No errors
}
function setAge() {
"use strict";
myObject.age = 25; // TypeError: can't define property "age": Object is not extensible
}
関数の引数リストの振る舞い
arguments
オブジェクトは、 厳密および非厳密モードでは異なる動作をします。 非厳密モードでは、 argument
オブジェクトは存在するパラメータの値の変化を反映しますが、 厳密モードではパラメータの値の変更はargument
オブジェクトに反映されません。
function add(a, b){
console.log(arguments[0], arguments[1]); // Prints : 1,2
a = 5, b = 10;
console.log(arguments[0], arguments[1]); // Prints : 5,10
}
add(1, 2);
上記のコードでは、 arguments
オブジェクトはパラメータの値を変更すると変更されます。ただし、 厳密モードの場合は、同じことが反映されません。
function add(a, b) {
'use strict';
console.log(arguments[0], arguments[1]); // Prints : 1,2
a = 5, b = 10;
console.log(arguments[0], arguments[1]); // Prints : 1,2
}
いずれかのパラメータがundefined
であり、 厳密モードまたは非厳密モードの両方でパラメータの値を変更しようとすると、 arguments
オブジェクトは変更されません。
厳密モード
function add(a, b) {
'use strict';
console.log(arguments[0], arguments[1]); // undefined,undefined
// 1,undefined
a = 5, b = 10;
console.log(arguments[0], arguments[1]); // undefined,undefined
// 1, undefined
}
add();
// undefined,undefined
// undefined,undefined
add(1)
// 1, undefined
// 1, undefined
非厳密モード
function add(a,b) {
console.log(arguments[0],arguments[1]);
a = 5, b = 10;
console.log(arguments[0],arguments[1]);
}
add();
// undefined,undefined
// undefined,undefined
add(1);
// 1, undefined
// 5, undefined
重複するパラメータ
Strictモードでは、重複した関数のパラメータ名を使用することはできません。
function foo(bar, bar) {} // No error. bar is set to the final argument when called
"use strict";
function foo(bar, bar) {}; // SyntaxError: duplicate formal argument bar
strictモードでの関数スコープ
厳密モードでは、ローカルブロック内で宣言された関数はブロック外ではアクセスできません。
"use strict";
{
f(); // 'hi'
function f() {console.log('hi');}
}
f(); // ReferenceError: f is not defined
Scope-wise、Strict Modeの関数宣言は、 let
やconst
と同じ種類のバインディングを持っています。
単純でないパラメータリスト
function a(x = 5) {
"use strict";
}
上記のような非単純なパラメータリストを持つ関数でディレクティブ"use strict"
を"use strict"
することができないため、JavaScriptが無効でSyntaxError
をスローします - デフォルト割り当てx = 5
非単純なパラメータには、
- デフォルト割り当て先
function a(x = 1) {
"use strict";
}
- 破壊
function a({ x }) {
"use strict";
}
- 残りパラメータ
function a(...args) {
"use strict";
}