3

どうしてJavaScriptで関数を呼び出せないの;ですか?

testMethodがどこかで宣言されているとしましょう...

testMethod();

testMethod() // Without semicolon will still work.

また、要素の例内でメソッドを呼び出します。

<input type="button" onclick="testMethod();" />
<input type="button" onclick="testMethod()" /> // Again no semicolon.
4

3 に答える 3

32

これは「自動セミコロン挿入」(またはASI)と呼ばれる機能です。

JavaScriptの自動セミコロン挿入の処理から

では、これらのセミコロンはどのように挿入されますか?これらのルールに従うことにより(ECMA-262第3版、7.9.1から言い換えて簡略化):

  • プログラムの解析中に、文法の生成で許可されていないトークン(問題のあるトークンと呼ばれる)が検出された場合、次の条件の1つ以上が当てはまる場合、問題のあるトークンの前にセミコロンが自動的に挿入されます。
    1. 問題のあるトークンは、少なくとも1つのLineTerminatorによって前のトークンから分離されています。
    2. 問題のあるトークンは}です。
  • トークンの入力ストリームの終わりに遭遇し、パーサーが入力トークンストリームを単一の完全なプログラムとして解析できない場合、入力ストリームの最後にセミコロンが自動的に挿入されます。
  • トークンは、文法の一部の生成で許可されている場合は制限付きトークンですが、生成は制限付き生成であり、トークンは、製造。

さらに、制限されたトークンが少なくとも1つのLineTerminatorによって前のトークンから分離されている場合、制限されたトークンの前にセミコロンが自動的に挿入されます。

..。

于 2012-05-14T18:41:31.433 に答える
2

JavaScript エンジンは、行末にセミコロンがあるべきであると判断した場合、行末にセミコロンを配置するためです。これにより、バグを回避するのではなく、バグが発生することがよくあります。

return
{
  user: 'foo'
}

上記の return ステートメントは...何も返しません:

return;
{
  user: 'foo'
}
于 2012-05-14T18:42:14.570 に答える
2

JavaScript インタープリターがセミコロンを追加します。セミコロンを省略することは非常に悪い考えです。これにより、解釈された JavaScript コードが予想とは異なる動作をする可能性があるためです。

ウィキペディアの破壊的な例を参照してください。

return
a + b;

// Returns undefined. Treated as:
//   return;
//   a + b;

関連している:

JavaScript のすべてのステートメントの後にセミコロンを使用することをお勧めしますか?

于 2012-05-14T18:44:37.673 に答える