Действительно ли это стиль блока?

Я только что просмотрел видео с презентацией Дугласа Крокфорда о его книге на 2009 год: Хорошие детали.

В видеоролике он объясняет, что следующий блок опасен, потому что он производит бесшумные ошибки:

return
{
    ok: false
};

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

return {
    ok: false
};

Вы можете увидеть его комментарии около 32 минут в видео здесь: http://www.youtube.com/watch?v=hQVTIJBZook&feature=player_embedded#!&start=1920

Я раньше этого не слышал и задавался вопросом, действительно ли это правило применяется или если это требование в синтаксисе было преодолено JavaScript-разработками, поскольку это утверждение было сделано.

Я нашел это очень интересным, так как я не писал этот код таким образом и хотел проверить, что эта информация не устарела.

Ответ 1

Бесшумная ошибка в том, что возвращается undefined!

Точки с запятой являются необязательными в JavaScript, и поэтому

return
{
    ok: false
};

анализируется так, как будто он

return;  // Leaves function straight away
{
    ok: false   
};

JSLint распознает такие шаблоны и предупредит о них:

lint warning: неожиданный конец строки; неоднозначно, являются ли эти строки частью одного и того же утверждения

lint warning: отсутствующая точка с запятой

lint warning: недоступный код

lint warning: бессмысленный блок; фигурные скобки не имеют никакого влияния.

Это обсуждалось в SO в "странном языке" .

Ответ 2

Правило все еще применяется.

Поскольку язык автоматически вставляет "отсутствующие" полуколоны, первый фрагмент интерпретируется как:

return;

{
    ok: false
};
Возвращается

I.e, undefined. Если бы код был каким-то образом разрешен для запуска через оператор return, тогда объект был бы создан, но не был бы назначен ни на что полезное (переменная).

Ответ 3

Javascript вставляет точку с запятой после возврата, потому что она "кажется отсутствующей".

Далее следует блок {ok: false}, который не имеет эффекта.

Так что это ошибка в спецификации javascript..

Моя рекомендация запускается jslint всякий раз, когда вы можете, и настраивайте ее, чтобы она соответствовала вашему стилю, когда она отличается от версии Crockford.

Ответ 4

Это очень реальная проблема. Непреднамеренно возвращая нуль может определенно сделать плохие вещи в вашем коде!

Ответ 5

Это правило применяется и сегодня, и является одной из "плохих частей". Первый фрагмент кода сделает функцию return undefined.

См. мой другой ответ по этой теме: Точка с запятой в С++?

Ответ 6

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

Javascript - почти не основанный на линии

Часть инструкции return:

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

function getAnswer() {
  var answer = 42;
  return
    answer;
} 

Затем он интерпретируется следующим образом:

function getAnswer() {
  var answer = 42;
  return;
  answer;
} 

Оператор return принимает безпараметрическая форма, и аргумент становится его собственным выражением.

Ответ 7

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

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

И мы знаем, что чем позже вы ошибетесь, тем больше будет дорого.