---
# System prepended metadata

title: JS ASI自動插入分號
tags: [Javascript]

---

---
tags: Javascript
---

# JS ASI自動插入分號

ASI 全名為 「Automatic Semicolon Insertion」，中文名稱為「自動分號插入」。


以下例子為例，如在結尾沒加上分號會自行插入

```javascript=
function hi () {
    return 
    'Hi'
}
console.log(hi()); // undefined
```

導致程式碼變成以下

```javascript=
function hi () {
    return; 'Hi';
}
console.log(hi()); // undefined
```

還有常見犯錯例子，也就是立即函式

```javascript=
(function() {
  console.log('hello')
})()

(function() {
  console.log('world')
})()
```

如下圖

![](https://i.imgur.com/8moyFl2.jpg)

解決方法如下，結尾或開頭加上分號
```javascript=
// plan A
;(function() {
  console.log('hello')
})()

;(function() {
  console.log('world')
})()

// plan B
(function() {
  console.log('hello')
})();

(function() {
  console.log('world')
})();
```

**不會**發生 ASI 的規則如下，可在頭或尾加上';'解決:

1. 新的一行是 `(`、`[`、`/` 開始 (容易出錯的地方)
2. 新的一行以 `+`、`-`、`*`、`%` 作開始 (會影響執行結果)
3. 新的一行以 `,`、`.` 作開始 (需注意執行結果)


一開始會想說誰不會在結尾加上分號，根本自找麻煩，結果[ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)的其中一個風格 **Standard** 就是提倡不在結尾處加上分號