WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

JavaScriptでの”use strict”宣言によるStrict モードの有効化

      2015/07/23

Strict モードとは

JavaScript内で”use strict”宣言を行うと、そのスクリプトはStrict モード(厳格モード)で実行されるようになる。
Strict モードではエラーのチェックが厳しくなるため、これまでエラーとならなかった曖昧な実装が動作しなくなる。

Strict モードを使わない理由は特に見当たらない。
ただすでに実装されたコードがStrict モードで動かない場合は注意が必要(後述するStrict モードを適用する範囲を合わせて対応可能)。

Strictモードではたらく制約

Strict モードでは、定義してない変数を使おうとすると参照エラーになったり、コンストラクタ関数を new を忘れて呼び出したとき this が undefined になったりと様々な制約が働くが、下記ページの「厳格モードのコード制約」が具体的なコードと共に制約が網羅されていて、詳しい。

厳格モード (JavaScript)

Strictモードの適用範囲

スクリプトや、関数において最初にある文字列(複数でも可)の中で “use strict” か ‘use strict’ があれば有効になる。
例えば、下記ではスクリプトの先頭に”use strict”宣言があるので、Strictモードは有効になる。

"use strict";
var greet = "Hello World.";

ただし、下記のように”use strict”宣言が変数の宣言など文字列リテラル以外の式の後にある場合は無効となる。

var greet = "Hello World.";
"use strict";

関係のない文字列リテラルが先にくるのは問題がなく、Strictモードは有効になる。

"use not strict";
"use strict";
var greet = "Hello World.";

空白やコメントがあっても有効。

    "use strict";    // Strictモードを使用
var greet = "Hello World.";

グローバルに適用

全てのコードよりも先頭に一行追加すれば全体が Strict モード になる(宣言後に連結されたすべてのスクリプトもStrict モードになる)。

"use strict";
var greet = "Hello World.";

Strictモード非準拠のコードを意図せず動作させるてエラーとなる可能性がある。
※JSHintではグローバルな Strict モード は警告される

関数単位で適用

関数の先頭で”use strict”宣言を行うと、関数単位でStrictモードが有効となる。
前述したようなStrictモード非準拠コードとの競合の問題が起こらないため、この方式がおすすめ。

//この関数はstrictモードで動作
function greet() {
    "use strict";
 
    var message = "Hello World";
    return message;
}

また、よく使われている var がグローバルを汚染しないようにするためにするためのイディオムと併用するといい。

(function() {
    "use strict";

    // ...
})();

参考資料

 - JavaScript ,