匿名函數function前面的! ~等符號做用小解

 [轉自]:http://www.cnblogs.com/xjser/p/5210697.html

 

很久沒寫博客了,剛過完年,給你們拜個晚年,你們新年快樂!javascript

相信昨晚前端,不少同窗應該都見過相似於:html

1
2
! function () { do  something...}()
~ function (){ do  something...}()

等這樣的匿名函數寫法!前端

固然對於老同志來講,確定是明白這樣寫法的做用了,可是對於新手來講可能會有必定的困擾,這裏就簡單給你們分享一下關於這種寫法的做用,以及原理!java

衆所周知,在js中能夠這樣建立一個匿名函數:函數

1
2
3
( function (){ do  something...})()
//或
( function (){ do  something...}())

而匿名函數後面的小括號()是爲了讓匿名函數當即執行,其實就是一個函數調用,相信你們都懂的!post

那你們有沒有想過爲何這麼寫就會報錯了:spa

1
function (){alert(1)}()

其實很簡單,由於function前面沒有(或者! ~之類的運算符,js解析器會試圖將關鍵字function解析成函數聲明語句,而不是函數定義表達式!code

做爲組運算符,小括號()會將其內部的表達式當成一個總體,而後返回結果,因此定義一個匿名函數正確的格式就是用小括號將函數體括起來!htm

一樣的! ~ + -等運算符也有一樣的效果,這是由於匿名函數也是一種值,這些運算符會將後面的函數體當成一個總體,先對匿名函數進行求值,而後在對結果進行運算!blog

不過這些運算符雖然可以達到讓匿名函數當即執行的目的,可是要當心他們是有反作用的,好比:

1
2
3
4
! function () { return  1}() //false
~ function () { return  1}() //-2
- function () { return  false }() //0
- function () { return  false }() //0

沒錯,他們會對函數的返回值進行運算,這樣可能會致使最終的結果和你想要的結果不同!固然,對於那些沒有返回值的函數來講,固然是沒有什麼影響了!

既然上面都說了可能會有反作用,那爲何還有這麼多人用了?

其實答案很簡單,無外乎兩點:

1.讓代碼看起來不容易懂,說白了就是裝~比~

2.少寫一個),偷懶唄!

固然通常這麼用的時候都是函數自己沒有返回值的狀況!(還有可能會有一些特殊的需求啦),爲了代碼可讀性,本人建議仍是按照正規的方式使用匿名函數,沒有特殊需求的狀況下儘可能不用這些運算符代替小括號!

相關文章
相關標籤/搜索