JSLint突然报告:使用"use strict"函数形式。

984

我包含了这个语句:

"use strict";

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

JSLint以前从未对此发出警告。但现在它发出了警告,提示:

使用"use strict"的函数形式。

有人知道什么是“函数形式”吗?

9个回答

1044

在包装函数中将'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是一个工具,用于帮助开发人员检查他们的JavaScript代码中的错误和潜在问题。

/*jshint strict:false */

或(根据Laith Shadeed

/* jshint -W097 */

要禁用JSHint的任何警告,请查看JSHint源代码中的映射(详见文档)。

更新2:JSHint支持node:boolean选项。请参阅在github上的.jshintrc

/* jshint node: true */

1
在 Visual Studio 的 JSLint 中,选项是:“允许全局 ES5 严格模式”。 - Jowen
11
这对于 Node 应用程序来说没有意义,然而 -1 - bevacqua
1
嗨Nico,我更新了答案,对于node,你可以输入:/* jshint -W097 */来禁用这个警告。 - Laith Shadeed
你是对的,同时也是globalstrict: true,http://www.jshint.com/docs/options/#globalstrict,但我没有检查jshint源代码以确认它们是否会得出相同的结果。 - Laith Shadeed
2
@Noumenon 这不是一个模板,而是一个指令,可以改变代码运行的环境。话虽如此,新的 ES6 语法(模块和类)默认是严格模式(参见 http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-code),因此在未来,这种写法就不需要到处添加了。同时,您可以将所有代码包装在 IIFE 中,以便每个文件只需指定一次 "use strict"; - bdukes
显示剩余6条评论

222

如果你正在为NodeJS编写模块,它们已经被封装了。告诉JSLint你已经有了node,只需在文件顶部包含:

/*jslint node: true */

2
请注意,此选项适用于JSLint,但是JSHint不能使用此指令关闭严格模式警告。对于JSHint,请尝试使用/*jshint strict:false */ - bdukes
4
使用 JSHint v2.9.2 为我调整语言。在 .jshintrc 文件中添加 "node": true" - RyanM

73
我建议使用jshint

它可以通过/*jshint globalstrict: true*/来抑制此警告。

如果您正在编写一个库,我只建议在您的代码封装成模块(如nodejs)时使用全局严格模式。

否则,您将强制每个使用您的库的人进入严格模式。


https://dev59.com/jWw15IYBdhLWcg3wIoVM - Daniel Kutik
6
FYI:JSHint 中的 globalstrict 选项已更改。现在尝试使用 strict: 'global',请参见 http://jshint.com/docs/options/#globalstrict。 - Hovis Biddle

19

我开始创建一个基于Node.js/browserify的应用程序,遵循Cross Platform JavaScript博客文章所述。但是我遇到了问题,因为我的全新Gruntfile没有通过jshint。

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

如果我们现在尝试,我们将扫描我们的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。我们可以设置一个JSHint规则来接受我们的Node程序。让我们编辑jshint任务配置并添加一个options键:

jshint: {
  options: {
    node: true
  },
}
node:true添加到jshint的options中,即可将jshint置于“Node模式”,这样我就可以消除两个错误。

18
在你的项目根目录下添加一个文件.jslintrc(或jshint的.jshintrc),其内容如下:
{
    "node": true
}

17

字符串形式本身并没有任何问题。

与其因为担心拼接非严格JavaScript而避免使用“全局”严格模式,不如直接将该非严格JavaScript修复为严格模式。


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

将以下代码添加到文件的起始位置:


1
我认为大家都忽略了这个问题中的“突然”部分。很可能,你的.jshintrc文件有语法错误,所以没有包含“browser”行。通过JSON验证器运行它,查看错误在哪里。

1
不是的,这突然发生是因为在线 JSLint 服务在2010年添加了该功能,而当时提问的时候还没有。 - Quentin

-4
这就是它的简单之处:如果你想对所有代码都严格执行,就在 JavaScript 开始时添加"use strict";
但如果你只想对某些代码进行严格执行,请使用函数形式。无论如何,我建议你在 JavaScript 开始时使用它,因为这将帮助你成为更好的程序员。

9
当我只在JS文件顶部添加"use strict"时,我确实会遇到这个错误,因此这可能并非完全正确。 - moesef
@moesef 这是因为你的代码存在错误。它只是为了帮助提高您的编码技能,使您的代码更加严谨... 它将不接受未声明的变量等。 - Jason Stackhouse
13
@JasonStackhouse说:不是真的。JSLint不会接受"global"形式的"use strict;",也就是仅仅放在你的代码顶部的形式。它只允许在函数中使用"use strict;"。然而,JS_Hint_允许您使用全局形式,在上面的答案中可以看到所需的设置。 - peterflynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接