Когда опасно разрывать строку после закрывающей скобки в Javascript? - PullRequest
6 голосов
/ 16 сентября 2010
  • В чем опасность разбить строку длинного кода на близкие скобки?

  • Когда Javascript может автоматически вставлять точку с запятой (предположительно, в этом и заключается опасность?).

  • Почему JSLint использует ) в качестве прерывателя строки?

В Javascript я иногда вижу одну длинную строку кода, разбитую на ), как это ( пример ):

function ()
{

или как это ( пример ):

object.methodOne()
      .methodTwo();

Но при чтении ожиданий разрыва строки для jsLint он говорит:

В качестве дополнительной защиты от механизма вставки точек с запятой JSLint ожидает прерывания длинных операторов только после одного из этих знаков препинания или операторов :

, ; : { } ( [ = < > ? ! + - * / % ~ ^ | &
== != <= >= += -= *= /= %= ^= |= &= << >> || &&
=== !== <<= >>= >>> >>>=

JSLint не ожидает прерывания длинного оператора после идентификатора, строки, числа, оператора приближения или суффикса:

. ) ] ++ --

Таким образом, закрывающая скобка выделяется как разрыв строки, который JSLint "не ожидает увидеть".

Я бы предпочел использовать

function() 
{

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

function () {

Могу ли я безопасно использовать ), чтобы разбить длинные строки?

Ответы [ 4 ]

4 голосов
/ 16 сентября 2010

Эта ссылка должна объяснить все это:

Вставка JavaScript в точку с запятой

«Опасность» связана с (взято из вышеуказанной ссылки, выделение добавлено):

В грамматике есть пять ограниченных произведений, это постфиксные операторы ++ и - , continue выражения, break операторов, return операторов и throw операторов.

function() не входит в этот список "опасности".Однако, при написании свободного кода с запятой (я не уверен, что это ваша цель :-), следует остерегаться строк, начинающихся с символов - таких как ( или [ - которые могут начинаться или продолжить выражение.Следующий код показывает пример кода, который вероятно неправильный:

x()
(function (){...})()

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

x()
;(function (){...})()

Лично мне не нравится JSLint :-) Удачного кодирования.

3 голосов
/ 16 сентября 2010

Точка с запятой будет вставлена ​​только в том случае, если следующая строка не является допустимым продолжением предыдущей строки (см. Исключения ниже). Так что function() { с { на следующей строке всегда безопасно.

Из спецификации ECMAScript:

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

• Токен-нарушитель отделен от предыдущего токена хотя бы одним LineTerminator.

• Токен-нарушитель -}.

Исключением из этого правила являются операторы увеличения / уменьшения, continue, break, return и throw, аргументы которых всегда должны быть в одной строке:

Если встречается токен ++ или -, когда синтаксический анализатор будет рассматривать его как постфиксный оператор, и между предыдущим токеном и токеном ++ или - произошел хотя бы один LineTerminator, то точка с запятой автоматически вставляется перед ++ или - токен.

Если встречается токен продолжения, разрыва, возврата или выброса, и перед следующим токеном встречается LineTerminator, точка с запятой автоматически вставляется после токена продолжения, разрыва, возврата или выброса.

2 голосов
/ 16 сентября 2010

Когда вы пытаетесь вернуть объект,

return {
 'foo': 'bar'
}

вернет объект, тогда как

return
{
  'foo': 'bar'
}

вернет undefined. Javascript автоматически вставит точку с запятой после return во втором примере, и объект никогда не будет достигнут.

Для функций, поскольку function() недействительно само по себе, не должно иметь значения, если скобка находится в той же строке или следующей.

См. Также раздел 7.9.1 Правила автоматической вставки точек с запятой спецификации ECMAScript. Помимо return, есть четыре другие ситуации, когда точка с запятой будет вставлена ​​из-за новой строки: break, continue, throw и ++ или --.

Если встречается токен continue, break, return или throw и LineTerminator перед следующим токеном, точка с запятой автоматически вставляется после continue , break, return или throw токен.

0 голосов
/ 16 сентября 2010

Это безопасно.

Я быстро взглянул на правила вставки точек с запятой в спецификации (3-е издание), и для объявлений функций все в порядке.

...