js自執行函數前加個分號是什麼意思?

在看有些源碼時,很多人寫腳本都在自執行函數前加個分號,這是為什麼?例如,以下代碼

;(function(){
//這應該是一個某系統的插件js
//具體功能代碼。。。
})();

上面的;號作用是什麼?


跟分號的宗教戰爭無關,這裡主要是由於JS擁有ASI(自動分號插入)機制而隱藏的問題。比方說,正確說出下面代碼的執行結果?(我已經給提示了~)

var test=function(a){
alert(a)
return function(c){
alert(c)
}
}(function(b){
console.log(b)
})(1)

寫IIFE的時候,在執行體前不主動加分號,上述代碼就是一個坑.....(單個代碼文件可以測試通過,但多個JS文件合併之後運行異常)

var test=function(a){
alert(a)
return function(c){
alert(c)
}
};(function(b){
console.log(b)
})(1)

因為這兩段代碼生成的語法樹是完全不一樣的。詳情請看Esprima: Parser,AST太長了,這裡就不貼了。


主要是應對代碼合併壓縮時,由於缺少分號;帶來的錯誤。

這個其實在目前普遍基於詞法解析來進行壓縮(UglifyJS等)的大趨勢下,並不是必須的了,所以理解為什麼要這麼做是避免教條的關鍵


有一種東西叫腳本壓縮,前端頁面要減少腳本數量和腳本大小,所以要把一類的腳本壓縮在一起,為了避免壓縮時前一個腳本沒有寫最後一個分號而導致壓縮後腳本不能使用,所以要在開始加一個分號


因為這世界上除了分號黨,還有「不寫分號黨」這種異端存在。


以 「(」、「[」、「/」、「+」、或 「-」 開始,那麼它極有可能和前一條語句合在一起解釋。

-《JavaScript 權威指南》


避免腳本壓縮帶來的報錯。


1.

(function(){alert("1")})()

(function(){alert("2")})()

報錯

2.

(function(){alert("1")})();

(function(){alert("2")})()

正確

沒有分號分隔挨著的函數,就會出錯。應該跟JS的解析有關。


腳本被引用時候,不會跟前文錯誤合併。


推薦閱讀:

什麼軟體能畫形如z=3x+4xy這種函數的圖像?
一個關於偏導數公式的問題:?u和?v為什麼不能約去?
高數書解答看不懂,求教一道基礎的導函數連續題?
圓、橢圓方程是函數么?

TAG:前端開發 | JavaScript | 函數 |