2012-12-16 83 views
1

问题

我做了一个示例JavaScript文件来说明我的困惑。混淆JSHint选项如何工作

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

这应该绊倒两个错误;首先使用==而不是===,其次是缺少分号。但是,当我运行时

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

on Node 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有问题。

回答

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版本将允许您忽略代码中的任何警告,即使没有对应的命名选项。

+0

谢谢你的非常透彻的答案。 – Aaron