Автоматическая вставка точки с запятой и инструкции 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 правила автоматической вставки точки с запятой Существует три основных правила вставки точки с запятой:

  1. когда, как программа анализируется слева направо, токен (называемый оскорбительным токеном) обнаружил, что не допускается никаким производством грамматики, затем точка с запятой автоматически вставляется перед оскорбительный токен, если выполняется одно или несколько из следующих условий:

    • маркер-нарушитель отделен от предыдущего маркера по крайней мере одним определителем линий.
    • оскорбительный токен }.
  2. когда, по мере того как программа анализируется слева направо, конец входного потока токенов встречающийся и синтаксический анализатор не может проанализировать входной поток токенов как одну полную программу ECMAScript, а затем точка с запятой автоматически вставляется в конец входного потока.

  3. когда при разборе программы слева направо встречается токен, разрешенный некоторыми производство грамматики, но производство является ограниченным производством, и токен будет первым маркер для терминала или нетерминала сразу после аннотации ?[нет 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, ваш исходный код легче читать.