很久沒寫博客了,剛過完年,給你們拜個晚年,你們新年快樂!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.少寫一個),偷懶唄!
固然通常這麼用的時候都是函數自己沒有返回值的狀況!(還有可能會有一些特殊的需求啦),爲了代碼可讀性,本人建議仍是按照正規的方式使用匿名函數,沒有特殊需求的狀況下儘可能不用這些運算符代替小括號!