以 “(”、“[”、“/”、“+”、或 “-” 開始的語句,那麼它極有可能和前一條語句合在一起解釋。
立即執行函式表示式
(function(){alert("1")})()// 可以正常執行
(function(){alert("2")})()// TypeError
複製程式碼
// 均可正常執行
(function(){alert("1")})();
(function(){alert("2")})()
複製程式碼
還是立即執行函式表示式
// 希望宣告obj後,能夠輸出到控制檯,但是會TypeError
var obj = {
a:1
}(function(){
console.log(obj)
})()
複製程式碼
var obj = {
a:1
};(function(){
console.log(obj)
})()//{a: 1}
複製程式碼
原因
- 因為JS的自動分號插入機制而隱藏的問題。
(
開頭的立即執行函式表示式,它的(funtion()
與上一句進行了解析。剩下的就只有{console.log(obj)})()
了。()
是執行函式,由於{console.log(obj)})
並不是一個函式,所以會出現TypeError。
如何避免
- 每句程式碼後面加分號表示已經結束
- 即使日常coding不會有這種寫法,但是在壓縮JS的時候,還是很大可能被壓縮成這樣,並且在當前的Chrome中也還是會報錯