JavaScriptの自動セミコロン挿入(ASI)のルールとは?仕組みと適用条件をわかりやすく解説
自動セミコロン挿入(ASI)とは
JavaScriptには「自動セミコロン挿入(ASI:Automatic Semicolon Insertion)」という仕組みがあり、コード内でセミコロンが省略された場合に、インタプリタが必要な箇所へ自動的にセミコロンを挿入してくれます。これにより、開発者はすべての文末にセミコロンを明示的に書かなくてもプログラムを動作させることができます。
ただし、ASIが常に期待どおりに動作するわけではないため、そのルールを正しく理解しておくことが重要です。
ASIの対象となる文(ステートメント)
自動セミコロン挿入の影響を受ける主な文は以下のとおりです。
- 空文(empty statement)
- var文
- 式文(expression statement)
- do-while文
- continue文
- break文
- return文
- throw文
ASIが機能する3つの基本ルール
ECMAScriptの仕様では、スクリプトまたはモジュールが左から右へ解析される際に、以下の条件に基づいてセミコロンが自動的に挿入されます。
1. 文法的に不正なトークンが出現した場合
文法上どの生成規則にも当てはまらないトークンが検出されたとき、次のいずれかの条件を満たしていれば、そのトークンの直前にセミコロンが挿入されます。
- 問題となっているトークンが
}である場合。 - 直前のトークンが
)であり、挿入されるセミコロンが do-while文 の終端セミコロンとして解釈できる場合。
2. 入力ストリームの終端に達した場合
トークンストリームの末尾まで解析した結果、パーサーが入力全体を完全なECMAScriptスクリプトまたはモジュールとして解釈できない場合にも、セミコロンが自動的に挿入されます。
3. 制限付き生成規則(Restricted Production)に該当する場合
トークン自体は文法上許容されているものの、その生成規則が「制限付き生成規則」であり、かつそのトークンが注釈([no LineTerminator here])の直後に続く終端記号または非終端記号の最初のトークンとなる場合です。このルールが関係する代表的な例が、return・break・continue・throw・後置インクリメント/デクリメントなどで、改行があると意図しない場所で文が区切られてしまうことがあります。
まとめ
ASIは便利な仕組みですが、特にreturnやthrowの直後に改行を入れたり、行頭を括弧 ( や角括弧 [ で始めたりすると、予期しない動作を引き起こす原因になります。チーム開発では一貫性を保つためにも、セミコロンを明示的に記述するスタイルを採用するのが安全です。
-
JavaScriptのeval()関数とは?基本的な使い方と危険性について解説
eval()関数とはJavaScriptのeval()関数は、引数として渡された文字列を評価し、それをJavaScriptコードとして実行するための関数です。文字列で記述された式や関数呼び出しを、その場で動的に処理できるのが特徴です。ただし、eval()の使用は非常に危険であることに注意が必要です。外部からの入力値をそのままeval()に渡してしまうと、悪意のあるコード(XSS攻撃など)を実行されてしまう可能性があります。そのため、実際の開発ではeval()の使用は避け、代替手段を検討することが推奨されています。eval()関数の使用例以下は、JavaScriptでeval()関数を使用するサ
-
JavaScriptのwithステートメントとは?用途と使い方をわかりやすく解説
JavaScriptのwithステートメントは、特定のプロパティに対してデフォルトのオブジェクトを指定し、冗長になりがちなオブジェクト参照の記述を省略するための構文です。withブロック内で指定したオブジェクトは、スコープチェーンの先頭に追加されるため、そのプロパティ名だけで直接アクセスできるようになります。 基本的な動作 通常、オブジェクトのプロパティにアクセスするには、毎回オブジェクト名を明示する必要があります。しかし、withステートメントを使えば、以下のようにコードを簡潔に書けます。 オブジェクト名の繰り返し記述を省略できる 同じオブジェクトの複数のプロパティへ短くアクセスできる 指