雑学1472721 views
小学算数1195447 views
高校国語785873 views
ヒストリア284663 views
高校化学2914160 views
教育148958 views
高校物理158371 views
中学社会667231 views
MathPython492025 views
中学英語809046 views
Help
Tools

English

厳格モード(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 を使用する限り、厳格モードは常に有効です。これにより、より安全で予測可能なコードを書くことができます。