可以想像得到,有很多方法立即執行匿名函數,簡單的整理就有下面三種的典型方式(還有其他方式的,歡迎告知):
方式一
(function() {
// …
})();
方式二
void function() {
// …
}();
方式三
~function() {
// …
}();
方式一和方式二大家可能都看過,這裡主要說明下方式三。在說明方式三之前,我們現回顧下運算子「~」(位取反)在EMCAScript 中的定義(第五版的第72 頁),簡單的翻譯下:
依運算子結合語句將舊值轉換為32 位元整數執行運算子後的語句轉換之行結果為32 位元整形並傳回
從上面可以了解,其實位運算子都能立即傳回後面表達式的值。其實其他位元運算子都可以達到這樣的目的,例如:
!function() {
// …
}();
等都可以達到我們的目的。所以其實「~」也並無其他的原因,僅是代碼「看著好看」而已:^)
效率與其說三種方式執行匿名函數的效率,到不如直接分析個運算子的執行效率。那我們比較再來看看「()」以及「void」在EMCA 規範中的定義
組運算子(第五版66 頁)
傳回表達式的執行結果
void(第五版70 頁)
依運算子結合語句執行返回undefined
由於群組運算子還需要執行語句並傳回語句區塊傳回的值,因此對比void 會多個取得語句區塊的運算(雖然消耗不了多少的效能),因此在這種情況下void 的效能要優於群組運算符。
對比兩者,那麼方式三的性能對比很明顯要低於前兩者。總結起來就是光從語法的角度分析,在上面三者匿名函數的方式中方式二優於方式一,方式三的效率最低。
總結思考下三者之間的優異
方式一的寫法很常見而且很保險,所以並不會有人因為你使用這種方式而責怪你但使用方式一的同學,可能經常會犯忘記匹配括號的“毛病”(特別是語句塊很長時,就常常搞錯)
使用位元運算子執行匿名函數很新潮,用來裝逼酷不錯很多IDE (如IDEA)以及語法高亮工具不支援方式三的寫法
void 效率最好,但總感覺相比其他兩種實現方式非常的臃腫(僅僅多幾個字符?)
那麼
綜合代碼量以及效率等情況考慮,用方式一沒錯的在需要額外節省代碼的極端情況,用方式三考慮效率優先,那麼使用方式二這裡要說明下,其實三種方式效率之間的差異非常小。因此單純拿效率來考慮採用那種方式,幾乎是站不住腳的。
具體採用何種方案,需依實際情況來考慮。例如我自己,常常會使用方式三,是因為1、方便(加一個字元即可) 2、在函數長的情況下匹配括號會很頭暈3、用起來很酷,但方式三會經常讓看我代碼的組員感到困擾。
如果在些類庫等框架性質的基礎代碼,用方式一最保險同時大家都容易看懂,是最保險的選擇。
[原文: http://www.gracecode.com/archives/3004/非常好,大家學一