JSLintオプション考察「missing ‘use strict’ pragma」

2013年08月16日

カテゴリー:

「missing ‘use strict’ pragma」は、JavaScriptコードをstrictモード(厳格モード)で実行することを表す「”use strict”宣言」の未使用を許可するかどうかのオプションです。デフォルト(false)では、関数はstrictモードで実行させることが強制されるため、”use strict”宣言は必須となります。

このオプションがデフォルト(false)の状態で、次のコードをJSLintでチェックすると「Missing ‘use strict’ statement.(=”use strict”宣言がありません)」という警告が表示されます。

(function () {
    var foo = 1,
        bar = 2;

    window.console.log(foo + bar);
}());

このコードに”use strict”宣言を加えると、下記のコードになります。

(function () {
    "use strict";
    var foo = 1,
        bar = 2;

    window.console.log(foo + bar);
}());

また、この“use strict”宣言は、関数の外側、つまりグローバルスコープで使用することも可能ですが、JSLintはあくまでも関数スコープでの宣言を強制します。

"use strict";  //Use the function form of 'use strict'.

(function () {
    var foo = 1,
        bar = 2;

    window.console.log(foo + bar);
}());

上記のコードでは、グローバルスコープで”use strict”; が宣言されていますので、コード全体がstrictモードで動作しますが、JSLintでは「Use the function form of ‘use strict’.」という警告が表示されます。「”use strict”宣言は関数内で使用しろ」的なことを言っているんだと思います。多分。

ちなみに、既に”use strict”宣言を行っている関数スコープ内で、新たに関数(子関数)を定義する場合、その関数には”use strict”宣言は不要です。

(function () {
    "use strict";

    function calc(a, b) {
        "use strict";  //Unnecessary 'use strict'.
        return a + b;
    }

    var foo = 1,
        bar = 2;

    window.console.log(calc(foo, bar));
}());

上記のコード例では、関数の中で別の関数が定義されていますが、外側の関数で既に”use strict”が宣言されているため、内側の関数では”use strict”宣言をしなくともstrictモードで実行されます。そのため、内側の関数で”use strict”宣言は不要となり、宣言すると「Unnecessary ‘use strict’.」(=「’use strict’は不要だ」)という警告が表示されます。

そもそも「strictモード」って?

JavaScriptにおける「strictモード」を一言で説明すると、「正しいコードのみを許可するモード」です。

  • “use strict”は使うべきなのか?
  • なぜグローバルスコープではなく、関数スコープでの宣言なのか?
  • strictモードに対応していないブラウザではどうなるのか?

といった部分が気になる方はuse strict”(厳格モード)を使うべきか?に詳細な考察をまとめておきましたので、参考になれば幸いです。こちらを見てもらえればJSLintがなぜこのように強制させるのかが分かると思います。

結局、このオプションはどうすれば良いのか?

特別な事情(コードの設計上の問題など)により、strictモードを適用できない場合を除き、JavaScriptコードはstrictモード準拠で書くべきだと考えます。そのため、このオプションはデフォルト(false)のままにしておくべきでしょう。

JSLintのオプション一覧ページへ