「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のオプション一覧ページへ