2012-12-16 84 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