JSLintが突然レポートします。「use strict」の関数形式を使用してください


930

私はステートメントを含めます:

"use strict";

ほとんどのJavascriptファイルの冒頭。

JSLintはこれについてこれまで警告していません。しかし今、それは言っています:

「use strict」の関数形式を使用します。

「関数形式」がどうなるか誰か知っていますか?

回答:


1010

'use strict';ラッピング関数の最初のステートメントとして含めるので、その関数にのみ影響します。これにより、厳密でないスクリプトを連結するときの問題を回避できます。

Douglas Crockfordの最新のブログ投稿Strict Mode Is Coming To Townをご覧ください。

その投稿の例:

(function () {
   'use strict';
   // this function is strict...
}());

(function () {
   // but this function is sloppy...
}());

更新: 即時機能でラップしたくない場合(ノードモジュールなど)は、警告を無効にできます。

以下のためのJSLint(あたりZhami):

/*jslint node: true */

以下のためのJSHint

/*jshint strict:false */

または(Laith Shadeedごと

/* jshint -W097 */

JSHintからの任意の警告を無効にするには、JSHintソースコードdocsの詳細)でマップを確認します。

更新2: JSHintnode:booleanオプションをサポートします。.jshintrcgithubを参照してください。

/* jshint node: true */

1
JSLint for Visual Studioでは、オプションは次のとおりです。「グローバルES5厳密を許可」
Jowen

10
ただし、これはNodeアプリケーションでは意味がありません。-1
bevacqua 2013

1
こんにちはニコ、私はあなたがタイプできるノードのために答えを更新しました:/ * jshint -W097 * /この警告を無効にする
Laith Shadeed

@LaithShadeed代替案は/*jshint strict:false */、あなたがしていることをより明確にすることです(私が知らない数値コードに特定の利点がない限り)
bdukes

2
@Noumenonこれは実際のボイラープレートではなく、コードが実行されている環境を変更するディレクティブです。つまり、新しいES6構文(モジュールとクラス)はデフォルトで厳密です(ecma-international.org/ecma-262/6.0/を参照)。 #sec-strict-mode-code)なので、今後はこれをどこにでも散らかす必要はありません。それまでの間、すべてのコードをIIFEでラップして、"use strict";ファイルごとに1回指定するだけで済みます。
bdukes 2015

217

NodeJSのモジュールを作成している場合、それらはすでにカプセル化されています。JSLintに、ファイルの先頭にインクルードしてノードがあることを伝えます。

/*jslint node: true */

2
ちなみに、このオプションはJSLintで機能しますが、JSHintはこのディレクティブによる厳格な警告をオフにしません。JSHintについては、試してみてください/*jshint strict:false */
bdukes

4
JSHint v2.9.2で私に言いました。"node": true.jshintrcに追加
RyanM

71

代わりにjshintを使用することをお勧めします。

これにより、この警告を抑制することができます/*jshint globalstrict: true*/

ライブラリを作成している場合、nodejsの場合のようにコードがモジュールにカプセル化されている場合にのみ、グローバルストリクトを使用することをお勧めします。

それ以外の場合は、ライブラリを使用しているすべてのユーザーを強制モードに強制します。



4
参考:JSHintのglobalstrictオプションが変更されました。strict: 'global'今すぐ試して、jshint.com / docs / options
Hovis Biddle

17

Cross Platform JavaScriptブログの投稿に従って、Node.js / browserifyアプリケーションの作成を開始しました。そして、私の新しいGruntfileがjshintを通過しなかったため、この問題に遭遇しました。

幸いなことに、私はGruntのLeanpub本で答えを見つけました。

今試してみると、Gruntfileをスキャンしていくつかのエラーが発生します。

$ grunt jshint

Running "jshint:all" (jshint) task
Linting Gruntfile.js...ERROR
[L1:C1] W097: Use the function form of "use strict".
'use strict';
Linting Gruntfile.js...ERROR
[L3:C1] W117: 'module' is not defined.
module.exports = function (grunt) {

Warning: Task "jshint:all" failed. Use --force to continue.

どちらのエラーも、GruntfileがNodeプログラムであり、デフォルトではJSHintがmoduleとの文字列バージョンを認識または使用できないためですuse strict。Nodeプログラムを受け入れるJSHintルールを設定できます。jshintタスク設定を編集して、オプションキーを追加しましょう。

jshint: {
  options: {
    node: true
  },
}

jshintを「ノードモード」にするnode: trueためにjshint optionsに追加すると、両方のエラーが削除されました。


16

プロジェクトのルートにファイル.jslintrc(またはjshintの場合は.jshintrc)を次の内容で追加します。

{
    "node": true
}

15

文字列形式には、本質的に問題はありません。

非厳密なJavaScriptを連結することを心配するために「グローバルな」厳密な形式を回避するのではなく、いまいましい非厳密なJavaScriptを厳密に修正することをお勧めします。


0

皆さんはこの質問の「突然」の部分を逃したと思います。ほとんどの場合、.jshintrcに構文エラーがあるため、「browser」行は含まれていません。jsonバリデーターを介して実行し、エラーの場所を確認します。


1
いいえ、質問が出された2010年にオンラインJSLintサービスがその機能を追加したため、突然起こりました。
クエンティン

0
process.on('warning', function(e) {
    'use strict';
    console.warn(e.stack);
});
process.on('uncaughtException', function(e) {
    'use strict';
    console.warn(e.stack);
});

この行をファイルの開始点に追加します


-4

これは非常に簡単です。すべてのコードを厳密にしたい場合"use strict";は、JavaScriptの最初に追加します。

ただし、一部のコードのみを厳密にしたい場合は、関数形式を使用します。とにかく、JavaScriptの最初に使用することをお勧めします。これにより、より優れたコーダーになるのに役立ちます。


8
私が実際にこのエラーを受け取るの"use strict";は、JSファイルの先頭に置くだけなので、これが完全に当てはまるとは限りません。
moesef 2013

@moesefこれは、コードにエラーがあるためです。コーディングスキルを向上させ、コードの「緩み」を減らすのに役立つだけです...宣言されていない変数などを受け入れません...
Jason Stackhouse

11
@JasonStackhouse:そうではありません。JSLintは「グローバル」形式のを受け入れません"use strict";。これは、コードの先頭に配置されるだけです。"use strict;"関数にラップされている場合にのみ許可されます。(ただし、JS_Hint_ではグローバルフォームを使用できます-必要な設定については上記の回答を参照してください)。
peterflynn 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.