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

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

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

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

等這樣的匿名函數寫法!java

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

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

(function(){do something...})()
//或
(function(){do something...}())

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

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

function(){alert(1)}()

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

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

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

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

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

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

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

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

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

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

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

相關文章
相關標籤/搜索