分號導致的問題
在 JavaScript
中分號是可選的,解釋器會自動對分號進行補全。
如果選擇不寫分號,需要注意一些使用上的問題。
不寫分號,相當于將插入分號的權利遞交給解釋器,對于某些情況,可能會出現非預期的效果:
函數返回值換行
var fn = function() {
return
'我怎么沒被返回呢??'
}
console.log(fn()) // 輸出:undefined
由于 return
已經是可以被作為完整的語句,所以解釋器會自動在 return
后插入一個分號,上面這段代碼在被處理后可能是這樣的:
var fn = function() {
return;
'我怎么沒被返回呢??';
};
console.log(fn());
所以輸出的是 undefined
。
某個變量或者屬性突然被當作函數調用
var number = 10
var result = 1 + number
(function() {
console.log(1)
})()
// 報錯 number is not a function
這種情況,解釋器會以為是要調用 number,但 number 是個數值,并不是一個函數,所以報錯了,這段代碼被處理后,可能是這樣的:
var number = 10;
var result = 1 + number(function() {
console.log(1);
})();
碰到這個問題的大部分場景都是寫自執行的匿名函數,所以通常不寫分號的情況下,要養成在自執行匿名函數前寫一個分號的習慣:
var number = 10
var result = 1 + number
;(function() {
console.log(1)
})()
數據被當作數組成員或對象成員進行訪問
var number = 1
var result = 1 + number
[1, 2, 3].forEach(function(item) {
result += item
})
// 報錯:Cannot read property 'forEach' of undefined
這個報錯原因和上一個點類似,也是 number
被誤當作有成員的對象或者數組了,上面代碼被處理后可能是這樣的:
var number = 1;
var result = 1 + number[1, 2, 3].forEach(function(item) {
result += item;
});
顯然 number[3]
是取不到東西的。
其他還有許許多多情況,場景與之都類似,所以在不寫分號的時候一定要注意,條件允許的情況下借助 eslint
來幫助檢查代碼。