1、概述
jshint是檢測JavaScript語法問題的工具,能夠根據本身的須要配置檢測規則。node
2、安裝
npm install jshint -g
通常全局安裝就能夠了,能夠在任何目錄下使用jshint命令。npm
3、簡單的使用方法
一、檢測單個js文件語法
在myfile.js所在的目錄運行:
jshint myfile.js
二、檢測當前目錄及其子目錄全部js文件的語法
jshint ./json
4、配置文件
有如下三種方法設置jshint配置文件
一、使用 –config 選項指定配置文件
Example:
jshint –config ./aaa ./
表示檢測當前目錄內全部的js文件,並指定配置文件爲當前目錄下的aaa文件。
二、使用 .jshintrc 文件,若是在運行jshint是,若是沒有–config 選項,則會以當前目錄的.jshintrc文件爲配置文件,若是當前目錄沒有這個文件,則以其父目錄.jshintrc 文件配置文件,仍沒有的話,則繼續找其父目錄,直至根目錄。
三、在nodejs項目的package.json文件的jshintConfig字段中設置配置文件。數組
5、內嵌配置
除了使用配置文件配置檢測規則外,還能夠在js文件內,使用特殊的註釋,配置檢測規則。
Example:
/* jshint undef: true, unused: true */
/* global MY_GLOBAL */
或者
// jshint undef: true, unused: true
這兩種註釋方式都是能夠的,其中global參數告訴JSHint,該變量是全局變量,從其餘js引入的。並且這些註釋的做用域是函數內,這意味着若是你把這段註釋放在某個函數內,則該配置只在該函數內起做用。安全
6、JSHint的配置選項
asi
若是是真,JSHint會無視沒有加分號的行尾,
自動補全分號一直是Javascript頗有爭議的一個語法特性。默認,JSHint會要求你在每一個語句後面加上分號,可是若是你認爲本身理解了asi(automatic semicolon insertion),你能夠拋棄JSHint對分號的檢查。閉包
bitwise
若是爲真,JSHint會禁用位運算符
Javascript容許位運算,可是他卻沒有整型,位運算符要把參與運算的數字從浮點數變爲整數,並在運算後再轉換回來。這樣他們的效率就不如在別的語言中那麼高。curl
boss
很霸氣的選項,若是爲真,那麼JSHint會容許在if,for,while裏面編寫賦值語句。
通常來講,咱們會在循環、判斷等語句中加入值的比較來作語句的運行條件,有時候會把==錯寫成賦值的=,一般,JSHint會把這個認定爲一個錯誤,可是開啓這個選項的化,JSHint就不會檢查判斷條件中的賦值 ,你是boss,你說的算:)。函數
curly
若是爲真,JSHint會要求你在使用if和while等結構語句時加上{}來明確代碼塊。
Javascript容許在if等結構語句體只有一句的狀況下不加括號。不過這樣作可能會讓你的代碼讀起來有些晦澀。工具
debug
若是爲真,JSHint會容許代碼中出現debugger的語句。不過建議你最好在檢測代碼前去掉debug的語句。this
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
嚴格模式作了幾件事情,
一、他能夠捕獲一些錯誤和異常
二、當咱們進行一下「不安全」的操做時,他會拋異常,例如訪問全局變量。
三、他會禁止你使用一些奇淫技巧,或者不良的代碼編寫。
white若是爲true,JSHint會依據嚴格的空白規範檢查你的代碼。