---
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')
})()
```
如下圖

解決方法如下,結尾或開頭加上分號
```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** 就是提倡不在結尾處加上分號