我制作了一个示例JavaScript文件来说明我的困惑。
(function() { console.log(true == true); })()
这应该会导致两个错误;首先使用==
代替===
,然后使用缺少的分号。但是,当我跑
var jshint = require('jshint').JSHINT;
jshint('(function() { console.log(true == true); })()');
节点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是否确实存在问题。
答案 0 :(得分: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版本允许您忽略其代码的任何警告,即使没有相应的命名选项。