サーチ…
自動セミコロン挿入ルール
セミコロン挿入の基本的なルールは3つあります。
- プログラムが左から右に解析されるときに、文法の生成によって許可されていないトークン( 嫌なトークンと呼ばれる)が発生した場合、以下のうちの1つ以上が該当する場合には、問題のトークンの前にセミコロンが自動的に挿入されます条件は真です:
- 問題のトークンは、少なくとも1つの
LineTerminator
によって前のトークンから分離されています。- 問題のトークンは
}
です。
- プログラムが左から右に解析されるときに、トークンの入力ストリームの終わりに遭遇し、パーサーが入力トークンストリームを単一の完全なECMAScript
Program
として解析できない場合、セミコロンは自動的に最後に挿入されます入力ストリーム。- プログラムが左から右に解析されるときに、文法の一部の生成によって許容されるトークンが遭遇するが、その生成は制限された生産であり、トークンは注釈の直後の端末または非終端記号の最初のトークン制限されたプロダクション内の " [ここでは
LineTerminator
ありません] "(したがってそのようなトークンは制限付きトークンと呼ばれます)、制限付きトークンは少なくとも1つのLineTerminator
によって前のトークンから分離され、 。セミコロンが空の文として解析される場合、またはセミコロンが
for
文のヘッダの2つのセミコロンのいずれかになる場合、セミコロンは自動的には挿入されません12.6.3)。
出典: ECMA-262、第5版ECMAScript仕様書:
自動セミコロン挿入の影響を受けるステートメント
- 空文
-
var
ステートメント - 表現式
-
do-while
ステートメント -
continue
声明 -
break
ステートメント -
return
文 -
throw
文
例:
トークンの入力ストリームの終わりに遭遇し、パーサーが入力トークンストリームを単一の完全なプログラムとして解析できない場合、入力ストリームの最後にセミコロンが自動的に挿入されます。
a = b
++c
// is transformed to:
a = b;
++c;
x
++
y
// is transformed to:
x;
++y;
配列インデックス/リテラル
console.log("Hello, World")
[1,2,3].join()
// is transformed to:
console.log("Hello, World")[(1, 2, 3)].join();
return文:
return
"something";
// is transformed to
return;
"something";
return文にセミコロンの挿入を避ける
JavaScriptコーディング規約では、ブロックの開始括弧を宣言の同じ行に配置します。
if (...) {
}
function (a, b, ...) {
}
次の行の代わりに:
if (...)
{
}
function (a, b, ...)
{
}
これは、オブジェクトを返すreturn文でのセミコロンの挿入を避けるために採用されています。
function foo()
{
return // A semicolon will be inserted here, making the function return nothing
{
foo: 'foo'
};
}
foo(); // undefined
function properFoo() {
return {
foo: 'foo'
};
}
properFoo(); // { foo: 'foo' }
ほとんどの言語では、開始ブラケットの配置は、コードの実行に実質的な影響を与えないため、個人的な好みの問題に過ぎません。 JavaScriptでは、見たように、最初の括弧を次の行に置くと、サイレントエラーが発生する可能性があります。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow