好久沒寫博客了,剛過完年,給大家拜個晚年,大家新年快樂!
相信昨晚前端,很多同學應該都見過類似於:
!function() {do something...}() ~function(){do something...}()
等這樣的匿名函數寫法!
當然對於老同志來說,肯定是明白這樣寫法的作用了,但是對於新手來說可能會有一定的困擾,這里就簡單給大家分享一下關於這種寫法的作用,以及原理!
眾所周知,在js中可以這樣創建一個匿名函數:
(function(){do something...})() //或 (function(){do something...}())
而匿名函數后面的小括號()是為了讓匿名函數立即執行,其實就是一個函數調用,相信大家都懂的!
那大家有沒有想過為什么這么寫就會報錯了:
function(){alert(1)}()
其實很簡單,因為function前面沒有(或者! ~之類的運算符,js解析器會試圖將關鍵字function解析成函數聲明語句,而不是函數定義表達式!
作為組運算符,小括號()會將其內部的表達式當成一個整體,然后返回結果,所以定義一個匿名函數正確的格式就是用小括號將函數體括起來!
同樣的! ~ + -等運算符也有同樣的效果,這是因為匿名函數也是一種值,這些運算符會將后面的函數體當成一個整體,先對匿名函數進行求值,然后在對結果進行運算!
不過這些運算符雖然能夠達到讓匿名函數立即執行的目的,但是要小心他們是有副作用的,比如:
!function() {return 1}()//false ~function() {return 1}()//-2 -function() {return false}()//0 -function() {return false}()//0
沒錯,他們會對函數的返回值進行運算,這樣可能會導致最終的結果和你想要的結果不一樣!當然,對於那些沒有返回值的函數來說,當然是沒有什么影響了!
既然上面都說了可能會有副作用,那為什么還有這么多人用了?
其實答案很簡單,無外乎兩點:
1.讓代碼看起來不容易懂,說白了就是裝~比~
2.少寫一個),偷懶唄!
當然一般這么用的時候都是函數本身沒有返回值的情況!(還有可能會有一些特殊的需求啦),為了代碼可讀性,本人建議還是按照正規的方式使用匿名函數,沒有特殊需求的情況下盡量不用這些運算符代替小括號!