问题
我制作了一个示例JavaScript文件来说明我的困惑。
(function() { console.log(true == true); })()
这应该会引发两个错误;首先是使用==
而不是===
,其次是缺少分号。然而,当我运行时
var jshint = require('jshint').JSHINT;
jshint('(function() { console.log(true == true); })()');
在Node REPL中,我在不希望出现错误的时候会出现错误。我希望没有错误的原因是因为在JSHint文档中,它说:
第二个参数[to jshint]是控制JSHINT的操作。大多数选项都是布尔值:所有选项都是可选的,并且默认值为false。
我希望这不会产生错误,因为我没有定义任何选项,所以所有选项都应该为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是否真的有问题。
并非所有选项在默认情况下都处于关闭状态。在我们的文档中(http://www.jshint.com/docs/)您可以看到,有些选项是"强制"的,有些选项则是"放松"的[1]。这意味着一些警告将默认显示,您需要启用"放松"选项来关闭它们
现在,有了这些信息,让我们来看看你的第二个问题:
/*jshint eqeqeq:false, asi:false */
(function () { console.log(true == true); })()
此代码将触发== true
和缺少分号的不安全比较警告。您试图通过关闭两个选项eqeq和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版本将允许您忽略代码中的任何警告,即使没有相应的命名选项。