SHint介紹
翻譯自www.jshint.comJSHint(注意不是jslint:))是一個由javascript社區驅動開發的用於檢查javascript代碼錯誤和問題的工具,有了他,可以使你保持一個良好的編碼風格。你可以很簡單的配置它以適應你目前的一個編碼風格。目前JSHint的源碼可以在github上面找到。
JSHint文檔
如何使用JSHint
JSHint是一個全局的函數,他接受兩個參數,JSHint(source,options);一個是代碼source,另一個是options(選項)第一個參數可以是一個字符串或者是一個字符串數組。如果是字符串,則他會被\n和\r分割,如果傳入的參數是數組,就要保證數組的每一項是一行代碼。因此源碼參數可以是javascript代碼或者是一個json形式。如果所有的檢測都ok,JSHint會返回true,否則就返回false。當返回false的時候,你可以用JSHint.errors來獲取錯誤信息或者用JSHint.data()來獲取lint的信息。如果要了解更多,參見源代碼。使用JSHint,你可以在js文件的開始設定選項,例如
/*jshint evil:true, boss:true */
而設定global參數可以告訴JSHint,全局的變量配置。例如
/*global DISQUS: true, jQuery: false */
以上的這個例子是告訴JSHint,DISQUS是你自己聲明的全局變量,而jQuery是你引入的全局變量
JSHint和JSLint有什么區別?
JSHint是JSLint的一個分支(fork),他比JSLint更加的便捷。用來約束你的代碼質量和編碼風格。每個人都有不一樣的編碼習慣和風格,JSHint通過配置可以適應於各種情況。JSHint的適用環境
- 瀏覽器環境(browsers)
- Node.js
- jQuery
- ES5
- CouchDB
- Prototype.js
- Mootools.js
JSHint的選項配置
asi
如果是真,JSHint會無視沒有加分號的行尾,自動補全分號一直是Javascript很有爭議的一個語法特性。默認,JSHint會要求你在每個語句后面加上分號,但是如果你認為自己理解了asi(automatic semicolon insertion),你可以拋棄JSHint對分號的檢查。
bitwise
如果為真,JSHint會禁用位運算符Javascript允許位運算,但是他卻沒有整型,位運算符要把參與運算的數字從浮點數變為整數,並在運算后再轉換回來。這樣他們的效率就不如在別的語言中那么高。
boss
很霸氣的選項,如果為真,那么JSHint會允許在if,for,while里面編寫賦值語句。一般來說,我們會在循環、判斷等語句中加入值的比較來做語句的運行條件,有時候會把==錯寫成賦值的=,通常,JSHint會把這個認定為一個錯誤,但是開啟這個選項的化,JSHint就不會檢查判斷條件中的賦值 ,你是boss,你說的算:)。
curly
如果為真,JSHint會要求你在使用if和while等結構語句時加上{}來明確代碼塊。Javascript允許在if等結構語句體只有一句的情況下不加括號。不過這樣做可能會讓你的代碼讀起來有些晦澀。
debug
如果為真,JSHint會允許代碼中出現debugger的語句。不過建議你最好在檢測代碼前去掉debug的語句。
eqeqeq
如果為真,JSHint會看你在代碼中是否都用了===或者是!==,而不是使用==和!=。我們建議你在比較0,''(空字符),undefined,null,false和true的時候使用===和!===。
eqnull
如果為真,JSHint會允許使用"== null"作比較。== null 通常用來判斷一個變量是undefined或者是null(當時用==,null和undefined都會轉化為false)。
evil
如果為真,JSHint會允許使用evaleval提供了訪問Javascript編譯器的途徑,這有時很有用,但是同時也對你的代碼形成了注入攻擊的危險,並且會對debug造成一些困難。記住,Function構造函數也是另一個‘eval’,另外,當傳入的參數是字符串的時候,setTimeout和setInterval也會類似於eval。
forin
如果為真,那么,JSHint允許在for in 循環里面不出現hasOwnProperty,for in循環一般用來遍歷一個對象的屬性,這其中也包括他繼承自原型鏈的屬性,而hasOwnProperty可以來判斷一個屬性是否是對象本身的屬性而不是繼承得來的。
immed
如果為真,JSHint要求匿名函數的調用如下:
(function(){//}());
而不是
(function(){//bla bla})();
laxbreak
如果為真,JSHint則不會檢查換行。Javascript會通過自動補充分號來修正一些錯誤,因此這個選項可以檢查一些潛在的問題。
maxerr
設定錯誤的閾值,超過這個閾值jshint不再向下檢查,提示錯誤太多。
newcap
如果為真,JSHint會要求每一個構造函數名都要大寫字母開頭。構造器是一種使用new運算符來創建對象的一種函數,new操作符會創建新的對象,並建立這個對象自己的this,一個構造函數如果不用new運算符來運行,那么他的this會指向全局對象而導致一些問題的發生。
noarg
如果為真,JSHint會禁止arguments.caller和arguments.callee的使用arguments對象是一個類數組的對象,它具有一個索引值。arguments.callee指向當前執行的函數(這個在ES5的嚴格模式中被禁用了),而arguments.caller指向調用當前函數的函數(如果有的話),並且,他並不是在所有的Javascript實現里面都有。
noempty
如果為真,JSHint會禁止出現空的代碼塊(沒有語句的代碼塊)。如果為真,JSHint會禁用構造器,以避免一些問題。在JSLint中會主動禁用構造器的方式以避免一些潛在問題,但其實很多構造器的使用並非有害,例如如下的調用
new JsUIWindow();//注意這個調用是沒有把構造器的結果賦值給變量的
因此,我們需要使用構造器的時候可以禁用這個選項。
nomen
如果為真,JSHint會禁用下划線的變量名。很多人使用_name的方式來命名他們的變量,以說明這是一個私有變量,但實際上,並不是,下划線只是做了一個標識。如果要使用私有變量,可以使用閉包來實現。
onevar
如果為真,JSHint期望函數只被var的形式聲明一遍。
passfail
如果為真,JSHint會在發現首個錯誤后停止檢查。
plusplus
如果為真,JSHint會禁用自增運算和自減運算++和--可能會帶來一些代碼的閱讀上的困惑。
regexp
如果為真,JSHint會不允許使用.和[^...]的正則,因為這樣的正則往往會匹配到你不期望的內容,並可能會應用造成一些危害。
undef
如果為真,JSHint會要求所有的非全局變量,在使用前都被聲明。如果你不在一個本地作用域內使用var的方式來聲明變量,Javascript會把它放到全局作用域下面。這樣會很容易引起錯誤。
sub
如果為真,JSHint會允許各種形式的下標來訪問對象。通常,JSHint希望你只是用點運算符來讀取對象的屬性(除非這個屬性名是一個保留字),如果你不希望這樣可以關閉這個選項。
strict
如果為真,JSHint會要求你使用use strict;語法。Strict 模式是ES5里面的一個新特性,他允許你把一個程序或者函數放在一個“嚴格”的作用域中。可見Resig寫的一篇關於嚴格模式的blog嚴格模式做了幾件事情:
1、他可以捕獲一些錯誤和異常
2、當我們進行一下“不安全”的操作時,他會拋異常,例如訪問全局變量。
3、他會禁止你使用一些奇淫技巧,或者不良的代碼編寫。
white
如果為true,JSHint會依據嚴格的空白規范檢查你的代碼。