我們都知道,函數(shù)的聲明方式有這兩種
function fnA(){alert('msg');}//聲明式定義函數(shù)
var fnB = function(){alert('msg');}//函數(shù)賦值表達(dá)式定義函數(shù)
樓主問題中出現(xiàn)的兩個函數(shù),都是匿名函數(shù)。通常,我們調(diào)用一個方法的方式就是 FunctionName()
但是,如果我們嘗試為一個“定義函數(shù)”末尾加上(),解析器是無法理解的。
function msg(){
alert('message');
}();//解析器是無法理解的
定義函數(shù)的調(diào)用方式應(yīng)該是 msg() ; 那為什么將函數(shù)體部分用()包裹起來就可以了呢?
原來,使用括號包裹定義函數(shù)體,解析器將會以函數(shù)表達(dá)式的方式去調(diào)用定義函數(shù)。也就是說,任何能將函數(shù)變成一個函數(shù)表達(dá)式的作法,都可以使解析器正確的調(diào)用定義函數(shù)。而 ! 就是其中一個,而 + - || 都有這樣的功能。
另外,用 ! 可能更多的是一個習(xí)慣問題,不同的運算符,性能是不同的。
推薦閱讀: 《 function與感嘆號》