Ну, во-первых, я должен спросить, зависит ли это от браузера.
Я читал, что если найден недопустимый токен, но раздел кода действителен до тех пор, пока этот недопустимый токен, точка с запятой вставляется перед токеном, если ему предшествует разрыв строки.
Однако, общий пример, процитированный для ошибок, вызванных вставкой точки с запятой:
return
_a+b;
.. который, кажется, не следует этому правилу, поскольку _a будет действительным токеном.
С другой стороны, разрыв цепочек вызовов работает, как и ожидалось:
$('#myButton')
.click(function(){alert("Hello!")});
У кого-нибудь есть более подробное описание правил?
Ответы:
Прежде всего вы должны знать, на какие операторы влияет автоматическая вставка точки с запятой (для краткости также называемая ASI):
var
заявлениеdo-while
заявлениеcontinue
заявлениеbreak
заявлениеreturn
заявлениеthrow
заявлениеКонкретные правила ASI описаны в спецификации §11.9.1 Правила автоматической вставки точек с запятой
Три случая описаны:
Когда встречается токен (
LineTerminator
или}
), который не разрешен грамматикой, перед ним вставляется точка с запятой, если:LineTerminator
.}
например :
превращается в
Соответствует
NumericLiteral
1
первому условию, следующий токен является ограничителем строки. Удовлетворяет второе условие, далее следует лексема .2
}
Когда встречается конец входного потока токенов, и синтаксический анализатор не может проанализировать входной поток токенов как одну завершенную Программу, тогда точка с запятой автоматически вставляется в конец входного потока.
например :
трансформируется в:
Этот случай возникает, когда токен разрешен некоторым производством грамматики, но производство является ограниченным производством , точка с запятой автоматически вставляется перед ограниченным токеном.
Ограниченные производства:
Классический пример с
ReturnStatement
:превращается в
источник
++c
для ясности?Прямо из ECMA-262, спецификация ECMAScript пятого издания :
источник
Я не мог понять эти 3 правила в спецификациях слишком хорошо - надеюсь, что у меня будет что-то более простое на английском языке - но вот что я собрал из JavaScript: Полное руководство, 6-е издание, Дэвид Фланаган, О'Рейли, 2011:
Quote:
Другая цитата: для кода
а также:
Я думаю, чтобы упростить это, это означает:
В общем, JavaScript будет рассматривать его как продолжение кода до тех пор , как это имеет смысл - за исключением 2 -х случаях: (1) после того, как некоторые ключевые слова , как
return
,break
,continue
и (2) , если он видит ,++
или--
на новой линии, то это добавит;
в конце предыдущей строки.Часть о «трактовать его как продолжение кода до тех пор, пока он имеет смысл» создает ощущение жадного соответствия регулярного выражения.
С учетом вышесказанного это означает, что
return
при разрыве строки интерпретатор JavaScript вставит;
(цитируем еще раз: если после любого из этих слов [например
return
]) появляется разрыв строки ... JavaScript всегда будет интерпретировать этот разрыв строки как точку с запятой)и по этой причине классический пример
не будет работать должным образом, потому что интерпретатор JavaScript будет обрабатывать его как:
Не должно быть разрыва строки сразу после
return
:чтобы он работал правильно. И вы можете вставить
;
себя, если будете следовать правилу использования;
после любого утверждения:источник
Что касается вставки точки с запятой и оператора var, остерегайтесь забывать запятую при использовании var, но охватывающую несколько строк. Кто-то нашел это в моем коде вчера:
Он запустился, но эффект состоял в том, что объявление / присваивание srcIds было глобальным, потому что локальное объявление с var на предыдущей строке больше не применялось, так как этот оператор считался завершенным из-за автоматической вставки точек с запятой.
источник
var srcRecords = src.records srcIds = [];
в одной строке и забудете запятую, или вы напишите «return a && b» и ничего не забудете ... но разрыв строки перед a вставит автоматическую точку с запятой после return, что определяется правилами ASI ...var
(let
,const
) в каждой строке превышает долю секунды, которая требуется для ее ввода.Самое контекстное описание автоматической вставки точек с запятой в JavaScript, которое я нашел, взято из книги о крафт-интерпретаторах .
Он продолжает описывать это так, как вы бы кодировали запах .
источник
Просто чтобы добавить,
увидеть это, используя немедленно вызванную функцию выражения (IIFE)
источник