1

问题

我制作了一个示例 JavaScript 文件来说明我的困惑。

(function() { console.log(true == true); })()

这应该会引发两个错误;首先使用 of==而不是===,其次是缺少分号。但是,当我跑步时

var jshint = require('jshint').JSHINT;
jshint('(function() { console.log(true == true); })()');

在 Node REPL 中,当我不希望出现错误时,我会收到错误。我期望没有错误的原因是因为在 JSHint 文档中,它说:

第二个参数 [to jshint] 是控制 JSHINT 操作的选项的可选对象。大多数选项都是布尔值:它们都是可选的,默认值为 false。

我希望这不会产生任何错误,因为我没有定义任何选项,所以一切都应该是错误的。意外行为的最后一部分是设置选项似乎什么都不做。以下对 jshint 的两次调用也会产生相同的错误:

var myFile = '(function() { console.log(true == true); })()';
jshint(myFile, {eqeqeq: false, asi: false});
jshint('/*jshint eqeqeq:false, asi:false */\n' + myFile);

问题

我不确定 JSHint 选项是如何工作的,我很可能会误解文档。我很高兴知道我在jshint上面的调用或我的假设中是不正确的,或者 JSHint 是否确实存在问题。

4

1 回答 1

6

默认情况下,并非所有选项都处于关闭状态。在我们的文档 (http://www.jshint.com/docs/) 中,您可以看到一些选项是“强制”和一些“放松”[1]。这意味着默认情况下会显示一些警告,您需要启用“放松”选项来关闭它们。

现在,有了这些信息,让我们看看你的第二个问题:

/*jshint eqeqeq:false, asi:false */
(function () { console.log(true == true); })()

此代码将触发一个不安全的比较警告== true和一个缺少的分号。你试图通过关闭两个选项 eqeqeq 和 asi 来解决这个问题。前者,当设置为 true 时,需要在任何地方进行严格比较,并且默认情况下是关闭的,因此您可以省略它。您会收到警告,因为 JSHint 认为== true/false/0/null比较不安全,目前无法关闭它(a == b例如,不会有警告)[2]。而后一个选项 (asi) 是一个轻松的选项,因此您实际上需要打开它来告诉 JSHint 可以容忍缺少分号。因此,要使您的示例通过,您需要以这种方式进行更改:

/*jshint asi:true */
(function () { console.log(true === true); }()

[1] — 我知道这很令人困惑。由于向后兼容性,我不能只改变选项的工作方式,但我正在努力使其不那么混乱。我将很快将每个选项的默认值添加到文档中。

[2] — 即将发布的 1.0.0 版本将允许您忽略其代码的任何警告,即使没有相应的命名选项。

于 2012-12-16T22:13:40.590 回答