JavaScript入門 | 例外処理 | Strictモード

strictモードとは?

ECMAScript 5で初めて導入されたstrictモードは、JavaScriptコードにより厳格なエラーチェックを適用する。

strictモードは、スクリプトや関数の先頭で"use strict"ディレクティブを使用して宣言できる。

"use strict"    // スクリプト全体をstrictモードに設定する。
try {
    num = 3.14; // 宣言されていない変数を使用したためエラーを発生させる。
} catch (ex) {
    document.getElementById("text").innerHTML = ex.name + "<br>";
    document.getElementById("text").innerHTML += ex.message;
}

このように宣言されたstrictモードは、該当ブロックのコードをstrictモードの構文に従って厳格に検査する。

str = "ミス!";    // 宣言されていない変数を使用したが、自動的にグローバル変数として宣言される。
document.getElementById("noStrict").innerHTML = str + "<br>";
function StrictBlock() {
    "use strict"  // 関数ブロックだけをstrictモードに設定する。
    try {
        num = 123 // 宣言されていない変数を使用したためエラーを発生させる。
    } catch (ex) {
        document.getElementById("funcStrict").innerHTML = ex.name + "<br>";
        document.getElementById("funcStrict").innerHTML += ex.message;
    }
}
StrictBlock();

上の例で、strictモードではないグローバル領域では、宣言されていない変数を使用しても自動的にグローバル変数として認識される。しかし、strictモードとして宣言された関数ブロックでは、宣言されていない変数を使用するとエラーが発生する。

strictモードをサポートする主なWebブラウザのバージョンは次の通りである。

ディレクティブ ie chrome firefox safari opera
use strict 10.0 13.0 4.0 5.1 12.0

strictモードの特徴

JavaScriptのstrictモードは、従来のJavaScript言語の一部機能を制限した構文を使用する。また、いくつかの重要な機能を修正し、強力なエラーチェックとともに向上したセキュリティ機能を提供する。

従来のJavaScript構文と異なるstrictモードの構文は次の通りである。

対象 制限事項
変数 宣言されていない変数やオブジェクトを使用できない。eval()関数内で宣言された変数は外部で使用できない。
プロパティ 読み取り専用プロパティには代入できない。同じプロパティを複数回定義できない。
関数 関数を文やブロック内で宣言できない。
パラメータ パラメータ名が重複してはならない。argumentsオブジェクトの要素値を変更できない。
文字列 文字列"eval""arguments"は使用できない。
8進数 数値リテラルに8進数値を代入できない。
this thisポインタが指す値がnullundefinedの場合、グローバルオブジェクトに変換されない。
delete deleteキーワードを使用できない。
with with文を使用できない。
予約語 次の予約語は使用できない: implements, interface, let, package, private, protected, public, static, yield