Я не мог понять эти 3 правила в спецификациях слишком хорошо - надеюсь, что у меня будет что-то более простое на английском языке - но вот что я собрал из JavaScript: Полное руководство, 6-е издание, Дэвид Фланаган, О'Рейли, 2011:
Quote:
JavaScript не обрабатывает каждый разрыв строки как точку с запятой: он обычно обрабатывает разрывы строки как точки с запятой, только если он не может проанализировать код без точек с запятой.
Другая цитата: для кода
var a
a
=
3 console.log(a)
JavaScript не обрабатывает второй разрыв строки как точку с запятой, потому что он может продолжить анализ более длинной инструкции a = 3;
а также:
два исключения из общего правила, что JavaScript интерпретирует разрывы строк как точки с запятой, когда он не может проанализировать вторую строку как продолжение оператора в первой строке. Первое исключение включает в себя операторы return, break и continue
... Если после любого из этих слов появляется разрыв строки ... JavaScript всегда будет интерпретировать разрыв строки как точку с запятой.
... Второе исключение включает операторы ++ и −− ... Если вы хотите использовать любой из этих операторов в качестве постфиксных операторов, они должны отображаться в той же строке, что и выражение, к которому они применяются. В противном случае разрыв строки будет рассматриваться как точка с запятой, а ++ или - будет проанализирован как префиксный оператор, примененный к следующему коду. Рассмотрим этот код, например:
x
++
y
Разбирается как x; ++y;
, а не какx++; y
Я думаю, чтобы упростить это, это означает:
В общем, JavaScript будет рассматривать его как продолжение кода до тех пор , как это имеет смысл - за исключением 2 -х случаях: (1) после того, как некоторые ключевые слова , как return
, break
, continue
и (2) , если он видит , ++
или --
на новой линии, то это добавит ;
в конце предыдущей строки.
Часть о «трактовать его как продолжение кода до тех пор, пока он имеет смысл» создает ощущение жадного соответствия регулярного выражения.
С учетом вышесказанного это означает, что return
при разрыве строки интерпретатор JavaScript вставит;
(цитируем еще раз: если после любого из этих слов [например return
]) появляется разрыв строки ... JavaScript всегда будет интерпретировать этот разрыв строки как точку с запятой)
и по этой причине классический пример
return
{
foo: 1
}
не будет работать должным образом, потому что интерпретатор JavaScript будет обрабатывать его как:
return; // returning nothing
{
foo: 1
}
Не должно быть разрыва строки сразу после return
:
return {
foo: 1
}
чтобы он работал правильно. И вы можете вставить ;
себя, если будете следовать правилу использования ;
после любого утверждения:
return {
foo: 1
};