厳格モード(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; // TypeError

this の違い

厳格モードでは、関数内の 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>

なぜ厳格モードが良いのか

バグになりやすいコードを早期に検出できる
JavaScript エンジンが最適化しやすくなる
将来の ECMAScript に備えた予約語が使用禁止になる
セキュリティが向上する

ES Modules を使用する限り、厳格モードは常に有効です。これにより、より安全で予測可能なコードを書くことができます。