[JS奇怪的世界]No.34 危險小叮嚀:自動插入分號

前言

接下來要講一個課堂上第一次出現的危險小叮嚀,自動插入分號,我們都知道程式語言並沒有真正的完美,我們也瞭解了 JavaScript 該注意的地方,但是這個章節要講的是真正危險的一個主題,而且非常常見、非常容易犯錯也很難追蹤,所以我們必須避免這個狀況。

自動插入分號

首先這個危險小叮嚀與 JavaScript 的語法解析器有關係也就是它的自動插入分號,我們前面瞭解那麼多都知道 JavaScript 語法解析器有多強大,它會盡可能幫助我們做一些事情,或許你已經注意到我們有沒有寫分號都沒有差異,甚至不是很必要,但為什麼這樣子?主要原因出在 JavaScript 幫我們自動插入分號,但這個動作有多危險?

一般來講語法解析器在解析語法是一個字一個字去檢查,舉例來講 r-e-t-u-r-n,解析完畢後若我們按下換行(carriage return 又稱 回車鍵、Enter)你會發生一些奇怪的事情 ,所以如果沒有分號或括號,JavaScript 就會幫我們補上它認為應該補的地方,所以我們必須理解到一件事情,並不是它並不需要分號而是 JavaScript 幫我們補上了,所以我們要盡可能避免讓 JavaScript 幫我們做決定補上分號,讓我們來看程式碼瞭解這個恐怖的問題 ↓

1
2
3
4
5
6
7
8
function getPerson() {
return
{
firstname: 'tomy'
}
}

getPerson();

這是一個很常見的狀況,執行後我們會得到什麼?

自動插入分號

我們可以看到,竟然沒有回傳 tomy,這就是自動補上分號的問題,我把程式碼打出來就會更清楚了。

1
2
3
4
5
6
7
8
function getPerson() {
return;
{
firstname: 'tomy'
}
}

getPerson();

JavaScript 自己幫我們在 return 最後補上分號,所以才不會回傳資料。

那正確應該怎麼寫?我們回頭想一下語法解析器是如何運作的,它是一字一字解析,所以應該要這樣寫

1
2
3
4
5
6
7
function getPerson() {
return {
firstname: 'tomy'
}
}

getPerson();

正確寫法

這樣語法解析器就會解析到 {,此時語法解析器就會知道「哦!你後面還有!」這樣它就會繼續解析了。

此時你可能會說那函數、for那些呢?

1
2
3
4
function getPerson()
{
...
}

其實是可以的,這是因為解析器之後函數之後一定還有內容,所以這樣可以這樣寫,但我們會這樣撰寫主要是避免一些奇怪的問題 ↓

1
2
3
function getPerson() {
...
}

所以這一章節我們理解到一個重點

只要是我們預期應該要輸入分號的地方,都應該自己補上這樣才能避免一些奇怪的問題。

圖源

JavaScript 全攻略:克服 JS 奇怪的部分

0%