1. 程式人生 > >前端封閉函式使用~ + -運算子的副作用

前端封閉函式使用~ + -運算子的副作用

眾所周知,在js中可以這樣建立一個匿名函式:

1

2

3

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

//或

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

而也有人這樣寫:

1

2

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

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

匿名函式後面的小括號()是為了讓匿名函式立即執行,其實就是一個函式呼叫,相信大家都懂的!

那大家有沒有想過為什麼這麼寫就會報錯了:

1

function(){alert(1)}()

其實很簡單,因為function前面沒有(或者! ~之類的運算子,js解析器會試圖將關鍵字function解析成函式宣告語句,而不是函式定義表示式!

作為組運算子,小括號()會將其內部的表示式當成一個整體,然後返回結果,所以定義一個匿名函式正確的格式就是用小括號將函式體括起來!

同樣的! ~ + -等運算子也有同樣的效果,這是因為匿名函式也是一種值,這些運算子會將後面的函式體當成一個整體,先對匿名函式進行求值,然後在對結果進行運算!

不過這些運算子雖然能夠達到讓匿名函式立即執行的目的,但是要小心他們是有副作用的,比如:

1

2

3

4

!function() {return 1}()//false

~function() {return 1}()//-2

-function() {return false}()//0

-function() {return false}()//0

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

既然上面都說了可能會有副作用,那為什麼還有這麼多人用了?

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

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

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

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