Автоматическая вставка точки с запятой и инструкции return [дубликат]
этот вопрос уже есть ответ здесь:
как вы знаете, ECMAscript пытается быть умным и автоматически вставляет точка с запятой если вы не написали их явно. Простой пример
function foo() {
var bar = 5
return bar
}
по-прежнему будет работать, как ожидалось. Но есть некоторые оговорки, если вы полагаетесь на это. Если мы перепишем эту функцию так
function foo() {
var bar = 5
return
{
bar: bar
}
}
..теперь эта функция будет возвращать undefined
потому что переводчик вставить точку с запятой сразу после return
оператор (вот почему вы всегда должны приносить фигурные скобки в той же строке, что и оператор).
однако, зная все это, мне интересно, как безопасное a return
заявление, как показано ниже, в браузерах и версиях
function foo() {
var a = true,
b = true,
c = false;
return a
&& b
&& c;
}
Я только что написал похожий return statement
в производственной среде. Просто потому, что я знал о "проблемах" с ECMAscript, не очень умным о вставке точки с запятой, мне интересно, работает ли этот код на 100%. В моих первых тестах на FF / Chrome / IE (последние версии) это кажется совершенно прекрасным, но это действительно так?
тут автоматическая запятой вставки "пробуждение", если есть ничего, кроме return
заявление в этой строке? Может ли кто-нибудь предоставить подробную информацию об этом на уровне реализации?
3 ответов
интерпретатор/компилятор javascript настолько умен, что вставляет только автоматические точки с запятой, если после этого есть действительный Javascript.
ваш код работает, потому что && b
в его нынешнем виде не является допустимым выражением - поэтому точка с запятой не вставляется после return a
в результате:
return a && b && c;
:
return (undefined);//implicitely inserted
{
....
}
является совершенно действительным, и именно поэтому точка с запятой вставляется.
для полноты ' ради ссылки на спецификацию:автоматическое запятой вставки. Эти примеры стоит прочесть.
не браузер/имплантирование конкретного, но Section 7.9 Automatic Semicolon Insertion
на Спецификация Языка ECMAScript стоит прочитать.
7.9 Автоматическая Вставка Точки С Запятой
некоторые операторы ECMAScript (пустой оператор, оператор переменной, оператор выражения, do-while оператор, оператор continue, оператор break, оператор return и оператор throw) должны быть заканчивается точкой с запятой. Такие точки с запятой всегда могут явно отображаться в источнике текст. Для удобство, однако, такие точки с запятой могут быть опущены из исходного текста в определенных ситуациях. Эти ситуации описываются тем, что точки с запятой автоматически вставляются в маркер исходного кода поток в таких ситуациях.
7.9.1 правила автоматической вставки точки с запятой Существует три основных правила вставки точки с запятой:
-
когда, как программа анализируется слева направо, токен (называемый оскорбительным токеном) обнаружил, что не допускается никаким производством грамматики, затем точка с запятой автоматически вставляется перед оскорбительный токен, если выполняется одно или несколько из следующих условий:
- маркер-нарушитель отделен от предыдущего маркера по крайней мере одним определителем линий.
- оскорбительный токен }.
когда, по мере того как программа анализируется слева направо, конец входного потока токенов встречающийся и синтаксический анализатор не может проанализировать входной поток токенов как одну полную программу ECMAScript, а затем точка с запятой автоматически вставляется в конец входного потока.
когда при разборе программы слева направо встречается токен, разрешенный некоторыми производство грамматики, но производство является ограниченным производством, и токен будет первым маркер для терминала или нетерминала сразу после аннотации ?[нет LineTerminator здесь]? в ограниченное производство (и поэтому такой токен называется ограниченным токеном), а ограниченный токен отделенный от предыдущего токена по крайней мере одним определителем линии, точка с запятой автоматически вставляется перед ограниченным токеном. Однако в предыдущих правилах есть дополнительное условие переопределения: точка с запятой никогда не вставляется автоматически, если точка с запятой будет затем проанализирована как пустой оператор или если это запятой станет одна из двух точек с запятой в заголовке оператора for (см. 12.6.3). Обратите внимание на следующие ограничения продукций в грамматике: PostfixExpression : LeftHandSideExpression [здесь нет линейного Определителя] ++ LeftHandSideExpression [здесь нет Определителя линий] -- ContinueStatement : продолжить [здесь нет Определителя линий] идентификатор ; BreakStatement : break [здесь нет линейного Определителя] идентификатор ; Оператор return : возвратите выражение [Нет LineTerminator здесь] ; ThrowStatement : выражение throw [нет LineTerminator здесь] ; Практический эффект этих ограниченных производств заключается в следующем:: Когда встречается ++ или -- token, где парсер будет рассматривать его как постфиксный оператор и по крайней мере один LineTerminator произошел между предыдущим токеном и ++ или -- token, затем точка с запятой автоматически вставляется перед ++ или -- token. При обнаружении маркера continue, break, return или throw и перед обнаружением Определителя линий следующий знак, a точка с запятой автоматически вставляется после маркера продолжить, прервать, вернуть или бросить. Полученный практический совет программистам ECMAScript: Оператор postfix ++ или -- должен отображаться в той же строке, что и его операнд. Выражение в инструкции return или throw должно начинаться с той же строки, что и токен return или throw. Идентификатор в инструкции break или continue должен находиться в той же строке, что и маркер break или continue.
7.9.2 примеры автоматических Запятой Вставки
источник
{ 1 2 } 3
не является допустимым предложением в грамматике ECMAScript, даже с автоматическими правилами вставки точки с запятой. В контраст, источник
{ 1
2 } 3
также не является допустимым предложением ECMAScript, но преобразуется автоматической вставкой точки с запятой в следующий:
{ 1
;2 ;} 3;
что является допустимым предложением ECMAScript. Источник
for (a; b
)
не является допустимым предложением ECMAScript и не изменено автоматической вставкой точки с запятой, поскольку точка с запятой необходима для заголовка инструкции for. Автоматическая вставка точки с запятой никогда не вставляет две точки с запятой в заголовке оператора for. Источник
return
a + b
преобразуется автоматической вставкой точки с запятой в следующее:
return;
a + b;
обратите внимание, что выражение a + b не рассматривается как значение, возвращаемое оператором return, поскольку a LineTerminator отделяет его от возврат токена. Источник
a = b
++c
преобразуется автоматической вставкой точки с запятой в следующее:
a = b;
++c;
Примечание маркер ++ не рассматривается как постфиксный оператор применении к переменной b, так как происходит LineTerminator между Б и с ++. Источник
if (a > b)
else c = d
не является допустимым предложением ECMAScript и не изменяется автоматической вставкой точки с запятой перед маркером else, хотя нет производства грамматики применяется на точка, потому что автоматически вставленная точка с запятой затем будет проанализирован как пустое утверждение. Источник
a = b + c
(d + e).print()
не трансформируется автоматической запятой вставки, потому что parenthesised выражение, которое начинается вторая строка может быть интерпретирована как список аргументов для вызова функции:
a = b + c(d + e).print()
в том обстоятельстве, что оператор присваивания должен начинаться с левой скобки, это хорошая идея для программист явным образом точка с запятой в конце предыдущего оператора, а не полагаться на автоматическая вставка точки с запятой.
ваш оператор return будет работать правильно во всех браузерах, как указывает Кристоф. Я предпочитаю сделать его еще более явным, если не для компьютеров, но для людей, по крайней мере, разместив операторы and по-разному:
return a &&
b &&
c;
в этом случае никому не нужно тратить секунду, задаваясь вопросом, будут ли автоматические полу-двоеточия сеять хаос. Я предпочитаю это только для JavaScript, ваш исходный код легче читать.