Я не мог понять эти 3 правила в спецификациях - надеюсь, у меня будет что-то более простое - но вот что я взял из JavaScript: Полное руководство, 6-е издание, Дэвид Фланаган, О'Рейли 2011:
Цитата:
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
};