nodejs雜談二:jshint

一、概述

jshint是檢測JavaScript語法問題的工具,可以根據自己的需要配置檢測規則。

二、安裝

npm install jshint -g
一般全局安裝就可以了,可以在任何目錄下使用jshint命令。

三、簡單的使用方法

1、檢測單個js文件語法
在myfile.js所在的目錄運行:
jshint myfile.js
2、檢測當前目錄及其子目錄所有js文件的語法
jshint ./

四、配置文件

有以下三種方法設置jshint配置文件
1、使用 –config 選項指定配置文件
Example:
jshint –config ./aaa ./
表示檢測當前目錄內所有的js文件,並指定配置文件爲當前目錄下的aaa文件。
2、使用 .jshintrc 文件,如果在運行jshint是,如果沒有–config 選項,則會以當前目錄的.jshintrc文件爲配置文件,如果當前目錄沒有這個文件,則以其父目錄.jshintrc 文件配置文件,仍沒有的話,則繼續找其父目錄,直至根目錄。
3、在nodejs項目的package.json文件的jshintConfig字段中設置配置文件。

五、內嵌配置

除了使用配置文件配置檢測規則外,還可以在js文件內,使用特殊的註釋,配置檢測規則。
Example:
/* jshint undef: true, unused: true */
/* global MY_GLOBAL */
或者
// jshint undef: true, unused: true
這兩種註釋方式都是可以的,其中global參數告訴JSHint,該變量是全局變量,從其他js引入的。而且這些註釋的作用域是函數內,這意味着如果你把這段註釋放在某個函數內,則該配置只在該函數內起作用。

六、JSHint的配置選項

(轉自:http://www.zipeng.info/archives/jshint-intro.html
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會允許使用eval
eval提供了訪問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會依據嚴格的空白規範檢查你的代碼。

原文地址:http://realwall.cn/blog/?p=148

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章