JSLint突然报告:使用“use严格”的函数形式

我包括以下声明:

"use strict";

在我的大多数JavaScript文件的开头。

JSLint以前从未警告过这一点。但现在它说:

使用函数形式的“使用严格”。

有没有人知道“函数”是什么?

297587 次浏览

在包装函数中包含'use strict';作为第一条语句,因此它只影响该函数。这可以防止在连接不严格的脚本时出现问题。

参见Douglas Crockford的最新博客文章严格模式即将到来

这篇文章的例子:

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

更新:如果您不想包装立即函数(例如它是一个节点模块),那么您可以禁用警告。

对于JSLint(每扎米):

/*jslint node: true */

对于JSHint

/*jshint strict:false */

或(每Laith Shadeed

/* jshint -W097 */

要禁用来自JSHint的任意警告,请检查JSHint源代码中的映射(详细信息在文档中)。

更新2:JSHint支持node:boolean选项。请参阅#1在github

/* jshint node: true */

没有什么天生的错误与字符串的形式。

与其因为担心连接非严格的javascript而避免“全局”严格形式,不如将该死的非严格javascript修复为严格。

这就是它的简单之处:如果您想严格执行所有代码,请在JavaScript的开头添加"use strict";

但是,如果您只想严格要求某些代码,请使用函数形式。无论如何,我建议您在JavaScript开始时使用它,因为这将帮助您成为更好的程序员。

如果您正在为NodeJS编写模块,它们已经被封装。告诉JSLint您已经获得了节点,方法是在文件顶部包含:

/*jslint node: true */

我建议使用jshint代替。

它允许通过/*jshint globalstrict: true*/抑制此警告。

如果你正在编写一个库,我只建议在你的代码被封装到模块中时使用全局严格,就像nodejs一样。

否则,您将迫使所有使用您的库的人进入严格模式。

我开始按照跨平台JavaScript博客文章创建一个Node.js/browserify应用程序。我遇到了这个问题,因为我的全新Gruntfile没有通过jshint。

幸运的是,我在关于Grunt的Leanpub书中找到了答案:

如果我们现在尝试,我们将扫描我们的Gruntfile…并得到一些错误:

$ grunt jshint
Running "jshint:all" (jshint) taskLinting 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不识别或允许使用moduleuse strict的字符串版本。我们可以设置一个JSHint规则来接受我们的Node程序。让我们编辑我们的jshint任务配置并添加一个选项键:

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

node: true添加到jshintoptions,将jshint置于“节点模式”,为我删除了两个错误。

在项目的根目录中添加一个文件. jslintrc(或jshint情况下的. jshintrc),内容如下:

{"node": true}

我想每个人都错过了这个问题的“突然”部分。很可能,您的. jshintrc有语法错误,所以它不包括“浏览器”行。通过json验证器运行它以查看错误在哪里。

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

将此行添加到文件的起点