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


好久沒寫博客了,剛過完年,給大家拜個晚年,大家新年快樂!

相信昨晚前端,很多同學應該都見過類似於:

!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.少寫一個),偷懶唄!

當然一般這么用的時候都是函數本身沒有返回值的情況!(還有可能會有一些特殊的需求啦),為了代碼可讀性,本人建議還是按照正規的方式使用匿名函數,沒有特殊需求的情況下盡量不用這些運算符代替小括號!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM