3

私は常に、JavaScript ソース コード内のすべての空白 (スペース、タブ、改行) は「等しい」、つまり識別子、キーワード、演算子などの言語要素を区切るためにすべて有効であると想定していました。

ただし、改行とスペースまたはタブの奇妙な違いに気付きました。コメント内でも!

これは問題なく動作します: (関数定義と関数呼び出しの間に改行がありますが、セミコロンはありません)

var bla = function() { alert('hello') }
bla();

これも機能します: (終了 } 文字と bla() 関数呼び出しの間のセミコロン)

var bla = function() { alert('hello') };bla();

ただし、これは機能しません: (スペースまたはタブが 1 つだけか、複数か、またはまったくないかにかかわらず、違いはありません)

var bla = function() { alert('hello') } bla();

そして、それはさらに奇妙になります。

これも機能しません: (スペース、タブ、セミコロンを含むコメントで区切られています)

var bla = function() { alert('hello') } /*  ; */ bla();

しかし、これは: (改行を含むコメント)

var bla = function() { alert('hello') }/*
*/bla();

jsfiddle のライブ デモ:

これは JavaScript のバグですか、それとも何か不足していますか?

4

1 に答える 1

5

これは空白の誤動作によるものではなく、Javascript の「ASI」機能である「自動セミコロン挿入」によるものです。

これは、Javascript 言語が最初に導入されたときに含まれていた機能です。基本的に、取引は次のとおりです。

コア JS 言語では、すべてのステートメントをセミコロンで終了する必要があります。

ただし、この言語は Web デザイナー (当時はプログラマーとは見なされていませんでした) を対象としていたため、パーサーは、開発者がセミコロンを含めるのを忘れた場合に寛容になるように変更されました。パーサーがセミコロンが欠落していると判断しても改行がある場合、セミコロンが意図されたものであると仮定します。

Frankly, this is a really really poor decision in the design of the language: it leads to a number of known quirks that can result in issues which can be very difficult to debug. In particular, you need to be very very careful about this around return statements that are returning multi-line object structure, but there are lots of other ways it can catch you out, as your question demonstrates.

The lesson to learn here is simple: always include the semi-colons between your JS statements, even where they appear to be optional.

このトピックに本当に興味がある場合は、ここで ASI の詳細を読むことができます。これは、Javascript プログラマーとして認識しておくべき重要なことです。しかし、一般的に、セミコロンだけを含めると、ほとんど忘れることができます。

于 2013-10-24T09:38:38.037 に答える