Действительно ли это стиль блока?
Я только что просмотрел видео с презентацией Дугласа Крокфорда о его книге на 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
Удивляясь, почему люди решают сделать материал необязательным, вам почти ничего не стоит добавить точку с запятой.
Но отладка этой ситуации может занять много времени.
В более общем плане, почему разработчик языка продолжал думать, что код должен самоисцеляться от ошибки пользователя.
Если люди ошибаются, следует предупредить. В противном случае вы столкнетесь с проблемой позже и позже.
И мы знаем, что чем позже вы ошибетесь, тем больше будет дорого.