---
type: why
language: javascript
slug: semicolon-asi
title: "なぜセミコロンを省いても動くのに、たまに壊れるのか"
title_tag: "JavaScript のセミコロン — 省いても動く理由と壊れる5つの行頭"
summary: >
  処理系が改行のところにセミコロンを補っています。ただし補わない場合があり、
  そこだけ意味が変わります。return の後の改行、行頭の括弧。実際に壊して確かめます。
description: >
  セミコロンは処理系が補っています。補わない場面が決まっているので、return の後で改行したり
  行頭を括弧で始めたりすると意味が変わります。実際に壊れる例を実行して確かめられます。
status: published
difficulty: 2
minutes: 8

versions:
  verified: "Node 22.22.3"
  since: "ES1"
  deprecated: null
  removed: null

sources:
  - title: "Automatic Semicolon Insertion — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-automatic-semicolon-insertion"
  - title: "The return Statement — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-return-statement"
  - title: "字句文法 — MDN"
    url: "https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Lexical_grammar"

terms: [自動セミコロン挿入, 文, 式]

links:
  related:
    - javascript/learn/function/basics
    - javascript/errors/is-not-a-function
    - javascript/errors/unexpected-token

content_updated_at: 2026-09-08
published_at: 2026-09-08
---

**処理系が、改行のところにセミコロンを補っているからです。**

```js run
const a = 1
const b = 2

console.log(a + b)
```
```output
3
```

これを[type:自動セミコロン挿入]と呼びます。

補うのは、**そのままでは読めなくなったとき**だけです。
だから「読めてしまう」場合は補われず、[bad:書いた人の意図と違う形]で通ります。

## 壊れる例1: `return` の後で改行する

**これがいちばん有名で、いちばん痛い失敗です。**

```js bad
function makeUser() {
  return
  {
    name: 'あ'
  };
}

console.log(makeUser());
```
```output
undefined
```

`return` の後ろの改行だけは、[em:仕様が「必ずセミコロンを補う」と決めています。]

つまり、こう読まれています。

```js
return;
{
  name: 'あ';
}
```

**`{ }` はオブジェクトではなくブロックとして読まれ、誰にも使われずに捨てられます。**
エラーも警告も出ません。

[dim:鍵が2つ以上あって末尾にカンマが付いていると、ブロックとしても読めないので `SyntaxError` になります。**落ちてくれるほうが、まだ幸運です。**]

```js run
try {
  new Function('return\n{\n  name: 1,\n};');
} catch (error) {
  console.log(error.name + ': ' + error.message);
}
```
```output
SyntaxError: Unexpected token '}'
```

括弧を開いてから改行してください。

```js run
function makeUser() {
  return {
    name: 'あ',
  };
}

console.log(makeUser());
```
```output
{ name: 'あ' }
```

## 壊れる例2: 行頭が `(` で始まる

```js bad
const value = 1

(function () {
  console.log('動かない');
})()
```
```output
TypeError: 1 is not a function
```

前の行の `1` と、次の行の `(` が繋がって
**`1(...)` という関数呼び出し**になりました。

`1` は関数ではないので落ちます。
→ [TypeError: x is not a function](/ja/javascript/errors/is-not-a-function/)

## 壊れる例3: 行頭が `[` で始まる

```js bad
const list = [1, 2]

[3, 4].forEach((n) => console.log(n))
```
```output
TypeError: Cannot read properties of undefined (reading 'forEach')
```

`[1, 2][3, 4]` と読まれ、**添字での取り出し**になりました。
`[3, 4]` はカンマ演算子で `4` になるので、`[1, 2][4]` は `undefined` です。
→ [TypeError: Cannot read properties of undefined (reading 'x')](/ja/javascript/errors/cannot-read-properties-of-undefined/)

[bad:文言のどこにも「セミコロン」とは出ません。] だから原因に辿り着きにくいのです。

## 補われない行頭は5つ

**次の文字で始まる行は、前の行と繋がります。**

| 行頭 | 何になるか |
|---|---|
| `(` | 前の行を**関数として呼ぶ** |
| `[` | 前の行から**添字で取り出す** |
| `` ` `` | 前の行を**タグ付きテンプレートとして呼ぶ** |
| `+` `-` | **足し算・引き算**になる |
| `/` | **割り算**か正規表現になる |

セミコロンを書かない流儀では、**この5つで始まる行の先頭にだけ**
セミコロンを置きます。

```js run
const list = [1, 2]

;[3, 4].forEach((n) => console.log(n))
```
```output
3
4
```

## 逆に、改行で切られてしまうもの

`return` のほかにもあります。**これらは改行を許しません。**

- `return`
- `throw`
- `break` / `continue`
- `++` / `--`（前の行との間）

```js run
let a = 1;
let b = 1;

a
++
b;

console.log(a, b);
```
```output
1 2
```

`a` の後ろでいったん切られ、`++b` として読まれました。
**`a` は増えていません。**

`throw` は、切られると文として成り立たないので落ちます。

```js run
try {
  new Function('throw\nnew Error("x");');
} catch (error) {
  console.log(error.name + ': ' + error.message);
}
```
```output
SyntaxError: Illegal newline after throw
```

構文の誤りは**実行前に止まる**ので、まだ気づけるほうです。
→ [SyntaxError: Unexpected token](/ja/javascript/errors/unexpected-token/)

## 続きの行は繋がる

**途中で終われない形なら、勝手に切られることはありません。**

```js run
function sum() {
  return 1 +
    2;
}

console.log(sum());
```
```output
3
```

`1 +` だけでは文として終われないので、次の行と繋がります。
長い式を折り返すときは、**演算子を行末に置いてください。**
→ [関数の基本 — 作る・呼ぶ・返す](/ja/javascript/learn/function/basics/)

## 結局どうすればよいか

**どちらでも構いません。プロジェクトの中で揃っていることのほうが大事です。**

| 流儀 | 気をつけること |
|---|---|
| 書く | `return` の後で改行しない |
| 書かない | `(` `[` `` ` `` `+` `-` `/` で始まる行の先頭に `;` を置く |

**どちらの流儀でも、整形器に任せるのがいちばん確実です。**
人が毎回判断するところではありません。

[dim:このサイトの掲載コードはセミコロンを書く流儀で揃えています。理由は「`return` の後で改行しない」だけを覚えればよいからで、優劣の主張ではありません。]

## よくある誤解

### 「セミコロンを全部書けば安全」

**`return` の後の改行は防げません。**

```js bad
function f() {
  return;
  {
    a: 1;
  }
}

console.log(f());
```
```output
undefined
```

自分で書いても同じです。**位置の問題であって、書くか書かないかの問題ではありません。**

### 「壊れたら必ずエラーになる」

例1がまさにそうです。`undefined` が返るだけで、**何も起きません。**
気づくのは、ずっと後の行で `undefined` を触ったときです。

## まとめ

- 省いても動くのは、処理系が[key:改行のところに補っている]から
- 補うのは**そのままでは読めないとき**だけ。読めてしまう形は繋がる
- **`return` の後の改行だけは必ず切られる。** 値が消える
- 行頭が `(` `[` `` ` `` `+` `-` `/` の行は、前の行と繋がる
- `throw` は改行すると `SyntaxError`
- 流儀はどちらでもよい。**整形器に任せる**
