厳格モード(strict mode)の自動適用
ES Modules では、すべてのコードが自動的に厳格モード(strict mode)で実行されます。明示的に "use strict" を書く必要はありません。
厳格モードとは
厳格モードは、JavaScript のより安全で最適化しやすいサブセットです。ES5 で導入され、いくつかの危険な機能を禁止し、エラーをより早く検出できるようにします。
通常モード
一部の危険な構文や動作が許容される
厳格モード
より厳密なエラーチェック、最適化しやすいコード
モジュールでは自動適用
ES Modules では、厳格モードが自動的に有効になります。
// module.js(type="module" で読み込む)
// "use strict" を書かなくても厳格モード
x = 10; // ReferenceError: x is not defined
// 通常モードでは暗黙のグローバル変数になるが、厳格モードではエラー厳格モードで禁止されること
厳格モードでは、いくつかの危険な構文や動作が禁止されます。
未宣言の変数への代入
変数を宣言せずに代入するとエラーになります。タイプミスによるバグを防げます。
読み取り専用プロパティへの代入
書き込み禁止のプロパティに代入するとエラーになります。
// 未宣言の変数への代入
name = "Alice"; // ReferenceError
// 正しい書き方
const name = "Alice";// 読み取り専用プロパティへの代入
const obj = {};
Object.defineProperty(obj, 'x', { value: 1, writable: false });
obj.x = 2; // TypeErrorthis の違い
厳格モードでは、関数内の this がグローバルオブジェクトにならず、undefined になります。
// 通常モード
function normalFunc() {
console.log(this); // window(ブラウザの場合)
}
// 厳格モード(モジュール内)
function strictFunc() {
console.log(this); // undefined
}禁止される構文
| 構文 | 説明 |
|---|---|
| with 文 | スコープチェーンを変更する危険な構文 |
| 8進数リテラル | 0123 のような形式(0o123 は可) |
| eval や arguments への代入 | 予約語として扱われる |
| 重複するパラメータ名 | function f(a, a) は禁止 |
// モジュール内では以下はすべてエラー
with (obj) { } // SyntaxError
const num = 0123; // SyntaxError(0o123 なら OK)
function f(a, a) { } // SyntaxError
eval = 10; // SyntaxErrorモジュールと通常スクリプトの混在
1つのページでモジュールと通常スクリプトを混在させることができます。
<!-- 厳格モード(自動) -->
<script type="module" src="module.js"></script>
<!-- 通常モード(明示的に厳格モードにする場合は "use strict" が必要) -->
<script src="script.js"></script>なぜ厳格モードが良いのか
ES Modules を使用する限り、厳格モードは常に有効です。これにより、より安全で予測可能なコードを書くことができます。