困惑于JSHint选项如何工作

问题

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

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

这应该绊倒两个错误; 首先使用==而不是=== ,第二,缺less分号。 但是,当我跑步

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

在节点REPL上我得到错误,当我不期望。 我期望没有错误的原因是因为在JSHint文档中,它说:

第二个参数[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的问题。

并非所有的选项默认都是closures的。 在我们的文档(http://www.jshint.com/docs/)中,您可以看到一些选项是“执行”和一些“放松”%5B1%5D。 这意味着一些警告将默认显示,您需要启用“放松”选项才能closures它们。

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

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

这段代码会触发一个不安全的比较警告== true和缺less分号。 你试图通过closures两个选项eqeqeq和asi来解决这个问题。 前者设置为true时,需要严格比较,默认closures,所以可以省略。 你会得到一个警告,因为JSHint认为== true/false/0/null比较不安全,目前没有办法把它closures(例如不会a == b警告)[2]。 而后一个选项(asi)是一个放松的选项,所以你实际上需要打开它告诉JSHint,没关系容忍丢失的分号。 所以为了让你的例子通过,你需要这样改变它:

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

[1] – 我明白这是令人困惑的。 由于向后兼容性,我不能改变选项的工作方式,但我正在努力减less混淆。 我将为文档中的每个选项添加默认值。

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