JavaScriptのストリクトモード解説
ストリクトモード(strict mode)は、JavaScriptにおいてより安全でエラーの発生を防ぐための特別な実行モードです。このモードを有効にすると、一部のエラーチェックが強化され、曖昧な挙動が禁止されます。
ストリクトモードとは
ストリクトモードはECMAScript 5(ES5)で導入された機能で、JavaScriptのコードの解釈をより厳密にするモードです。これにより、古い非推奨の機能や潜在的に問題を引き起こす可能性のあるコードの使用を防ぐことができます。
ストリクトモードの有効化方法
ストリクトモードは、コードの先頭に以下のディレクティブを記述することで有効化できます。
'use strict';
このディレクティブはスクリプト全体または特定の関数に適用できます。
スクリプト全体で有効化する例
'use strict';
var x = 10;
console.log(x);
特定の関数内で有効化する例
function strictFunction() {
'use strict';
var x = 10;
console.log(x);
}
ストリクトモードの特徴
ストリクトモードでは、いくつかの制限や改善が行われます。
暗黙的なグローバル変数の禁止
宣言されていない変数に値を代入するとエラーになります。
// ストリクトモードでない場合
y = 10; // 暗黙的なグローバル変数として定義される
// ストリクトモードの場合
'use strict';
y = 10; // ReferenceError: y is not defined
セキュリティリスクの軽減
特定の曖昧なコードの動作が禁止されます。
'use strict';
with (Math) { // with文の使用はストリクトモードでは禁止されています
x = cos(2);
}
// SyntaxError: Strict mode code may not include a with statement
既存のプロパティの削除の禁止
オブジェクトのプロパティを削除する場合、厳密にチェックされます。
'use strict';
var obj = {};
Object.defineProperty(obj, 'x', { value: 10, configurable: false });
delete obj.x; // TypeError: Cannot delete property 'x'
重複した引数名の禁止
関数宣言で同じ名前の引数を持つことが禁止されます。
'use strict';
function duplicateArgs(a, a) { // SyntaxError: Duplicate parameter name not allowed in this context
return a;
}
ストリクトモードの具体例
暗黙の型変換が厳密に
例:数値として評価されないプロパティへの代入
'use strict';
var obj = {};
obj[3.14] = 'π';
console.log(obj['3.14']); // 'π'
安全性の向上
例:thisの値が未定義になる場合
'use strict';
function example() {
console.log(this); // undefined
}
example();
互換性と注意点
ストリクトモードはモダンなJavaScriptエンジンでサポートされています。ただし、古いブラウザではサポートされていない可能性があるため、注意が必要です。
ストリクトモードを使うことで、バグの原因を早期に発見しやすくなりますが、既存のコードに導入する際は十分にテストを行うことが重要です。