Существуют ли вставки с точкой с запятой с продолжающимися операторами на следующей строке?

Исторически мне нравится разбивать выражения так, чтобы "это явно неполное" смещение показывалось на продолженной строке:

var something = foo + bar
    + baz(mumble);

Это отношение, которое исходит от работы на языках, которым нужны точки с запятой, чтобы прекратить выражения. Первая строка уже явно неполна из-за отсутствия точки с запятой, поэтому лучше дать читателю понять, что вторая строка не завершена.

Альтернативой может быть:

var something = foo + bar +
    baz(mumble);

Это не так хорошо для меня. Теперь единственный способ сказать, что baz(mumble); не является автономным (отступом в сторону), является проверка ваших глаз до конца предыдущей строки. (Это, по-видимому, длинный, так как вам нужно было сломать его в первую очередь.)

Но в bizarro JavaScript land я начал замечать людей, меняющих код, от вещей, которые были похожи на первую форму на вторую, и предупреждения о "автоматической вставки точки с запятой". Это, безусловно, вызывает несколько удивительных поведений. Не желая вникать в тангенс в то время, когда я добавляю "узнать, что такое автоматическая точка с запятой, и должен ли я делать это слишком" в моей бесконечной очереди задач.

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

var something = foo + bar
    baz(mumble);

... тогда JavaScript вставляет точку с запятой после foo + bar для вас, по-видимому, потому что обе строки являются самостоятельными как полные выражения. Я предположил, что, возможно, эти другие программисты из JavaScript думали, что смещение "явно преднамеренно неполного" бита в конец линии будет продолжаться лучше, потому что оно точно определяет место, где точка с запятой не была.

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

Правильно ли, что мой способ не является риском для условий, описывающих, как я использую продолжение линии? Существуют ли какие-либо "неполные кажущиеся" ловушки выражений, которые на самом деле полны неожиданными способами?

Чтобы предложить пример "полных неожиданными способами", подумайте, можно ли интерпретировать + 1; как положительную по одной строке. Кажется, что это возможно:

plus one semicolon

Но jsfiddle возвращает 6 для этого:

var x = 3 + 2
+ 1;
alert(x)

Возможно, это просто причуда в консоли, но это заставляет меня беспокоиться о моем "все в порядке, пока вторая строка не одинока, как полная интерпретация".

Ответ 1

Если вы возьмете синтаксически допустимую строку и выделите ее разрывами строк, автоматическая вставка точки с запятой не будет применяться (за исключением узких случаев return, throw и очень немногих других операторов, перечисленных ниже). ASI возникает только тогда, когда нет никакого другого способа интерпретировать код. Конечно, есть способ интерпретировать ваш многострочный код как один оператор, потому что он действителен как одна строка. Короче говоря, ASI, как правило, является средством последней попытки в попытке понять парсер.

Чтобы привести ES5, появляется первый случай ASI, подробно описанный в спецификации.

  • Когда, когда программа анализируется слева направо, появляется токен (называемый оскорбительным токеном), который не допускается никаким произведением грамматики...

Но этот случай естественно устраняется, потому что у вас была грамматически допустимая строка, прежде чем вы ввели в нее новую строку. Таким образом, этот случай ASI не может применяться к вашему делу, потому что он зависит от диапазона кода, который не является синтаксически действительным без точек с запятой. У вас этого нет.

(Остальные два случая также не применяются: второй случай применяется к концу программы, а третий - к continue, break, return, throw и postfix ++/--.)

Общая проблема, с которой сталкиваются люди с ASI, возникает, когда автор имеет две строки, которые, как он ожидает, будет стоять отдельно, но эти две строки не вызывают грамматической проблемы, если понимать ее как одну строку. Этот случай начинается с двух строк, и они случайно становятся таковыми. Ваши случаи - обратные: вы начинаете с одной строки; это не случайно становится двумя.

Ответ 2

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

Это мусор. Когда у вас есть оператор (в любой строке), не будет ASI - см. Каковы правила автоматической вставки точки с запятой JavaScript (ASI) JavaScript?

Поскольку оба стиля размещения оператора будут работать, оба они обычно принимаются, и это сводится к предпочтениям личного/стиля. Вы уже назвали некоторые аргументы, после того как вы выбрали либо придерживаться его для согласованности.

В этом нет ничего "опасного", и, честно говоря, вам не нужно заботиться об ASI. Люди укушены им только потому, что а) они не любят точки с запятой и ожидают автоматической вставки, но следующая строка является синтаксически допустимым продолжением или б) они пишут литералы объектов/массивов после оператора return в стиле Allman.