Я не міг занадто добре зрозуміти ці 3 правила у специфікаціях - сподіваюся, що у мене є щось більш просте англійське - але ось, що я зібрав із JavaScript: Посібник із визначенням, 6-е видання, Девід Фланаган, O'Reilly, 2011:
Цитата:
JavaScript не розглядає кожен розрив рядка як крапку з комою: зазвичай розглядає розриви рядків як крапки з комою, лише якщо він не може проаналізувати код без крапки з комою.
Ще одна цитата: для коду
var a
a
=
3 console.log(a)
JavaScript не розглядає розрив другого рядка як крапку з комою, оскільки він може продовжувати розбір більш тривалого оператора a = 3;
і:
два винятки із загального правила, що JavaScript інтерпретує розриви рядків як крапки з комою, коли він не може проаналізувати другий рядок як продовження заяви на першому рядку. Перший виняток передбачає заяви про повернення, перерву та продовження
... Якщо після будь-якого з цих слів з’являється розрив рядка, JavaScript завжди буде інтерпретувати цей розрив як крапка з комою.
... Другий виняток включає операторів ++ та −− ... Якщо ви хочете використовувати будь-який з цих операторів як операторів постфіксу, вони повинні відображатися в тому ж рядку, що і вираз, до якого вони застосовуються. В іншому випадку розрив рядка буде розглядатися як крапка з комою, а ++ або - буде аналізуватися як оператор префікса, застосований до коду, що випливає. Розглянемо цей код, наприклад:
x
++
y
Розбирається як x; ++y;
, а не якx++; y
Тому я думаю, щоб спростити це, це означає:
Загалом, JavaScript розглядатиме його як продовження коду до тих пір , як це має сенс - за винятком 2 -х випадках: (1) після того, як деякі ключові слова , як return
, break
, continue
і (2) , якщо він бачить , ++
або --
на новій лінії, то це додасть ;
в кінці попереднього рядка.
Частина про "ставитися до цього як до продовження коду до тих пір, поки це має сенс" дає відчуття, як жадібна відповідність регулярного виразу.
З урахуванням сказаного, що означає для return
розриву рядка, інтерпретатор JavaScript вставить a;
(цитується ще раз: Якщо після будь-якого з цих слів з’являється розрив рядка [наприклад return
] ... JavaScript завжди буде інтерпретувати цей розрив як крапку з комою)
і з цієї причини класичний приклад
return
{
foo: 1
}
не працюватиме, як очікувалося, оскільки інтерпретатор JavaScript трактує це як:
return; // returning nothing
{
foo: 1
}
Не повинно бути перерв лінії відразу після return
:
return {
foo: 1
}
щоб вона працювала належним чином. І ви можете вставити ;
себе, якщо слід дотримуватися правила використання ;
після будь-якого оператора:
return {
foo: 1
};