Почему позиция { влияет на этот код Javascript?

Я потратил довольно много времени на эту проблему с Javascript (вы можете сказать, что я новичок в JS):

Возьмите хорошо написанный код Javascript, подобный этому примеру шаблона раскрывающегося модуля:

Запуск работает нормально. Затем переместите «{» на следующую строку (как разработчик С#, я настроил все свои среды так, чтобы в новых строках помещались фигурные скобки) и запустите его снова.

  return   
  {
    someMethod : myMethod,
    someOtherMethod : myOtherMethod
  };

Теперь он получает довольно много ошибок JS вокруг «Ошибка разрыва строки 13 'возврат'». и «Uncaught SyntaxError: Unexpected token:» в отладчике Chrome.

Мой вопрос в том, как что-то может синтаксически влиять на Javascript, как это?

Я настроил его здесь, в JSFiddle (чтобы заставить его работать, переместите { после "return" обратно на та же строка)


person Rodney    schedule 04.03.2014    source источник


Ответы (5)


Одной из худших функций JavaScript является автоматическая вставка точки с запятой.

return; // a semicolon is implicitly inserted here

И эта часть почти правильный JavaScript, но не совсем, поэтому вы получаете синтаксическую ошибку:

{
    someMethod : myMethod,
    someOtherMethod : myOtherMethod
};

Если бы вы пытались сделать это:

return
    [ 1, 2, 3,
      4, 5, 6,
      7, 8, 9 ];

он бы всегда возвращал undefined, и это было бы плохо. ASI — отстой, но сейчас мы с ним застряли, тем более что код без запятой стал причудой.

Что это делает?

return a
     + b
     + c;

Этот?

return e
     / f /g;

Ладно, ладно, может быть, это немного надумано, а может быть, это не совсем актуально. Но АСИ плохой. Я надеюсь, что все это понимают.

person Ry-♦    schedule 04.03.2014

Поскольку в стандартном разделе 12.9 ECMA указано, что вы не можете новая строка между ключевым словом return и его выражением.

    ReturnStatement :
       return ;
       return [no LineTerminator here] Expression ;
person Phillip Kinkade    schedule 04.03.2014

Javascript делает что-то, называемое автоматической вставкой точки с запятой, что, как мне кажется, влияет на ваши результаты здесь. По сути, он видит оператор return, после которого в строке ничего нет, и думает, что это конец строки, и возвращает значение, завершая функцию.

person Will P.    schedule 04.03.2014

Поскольку return ожидает значение (или переменную), когда вы помещаете фигурную скобку в ту же строку, вы указываете вернуть хэш, но если вы переместите фигурную скобку на следующую строка, то вы говорите ничего не возвращать, поэтому следующая строка не ожидается.

EDIT Следующая строка не ожидается в контексте возврата.

person Aguardientico    schedule 04.03.2014
comment
Все правильно, кроме этого: так что следующей строки не ожидается. Ожидается следующая строка, но оператор { foo: 'bar' }; синтаксически неверен - person zerkms; 05.03.2014
comment
Отредактировано, чтобы дать более объясненный ответ, поэтому следующая строка не ожидается - person Aguardientico; 05.03.2014
comment
Хорошо. Поскольку return ожидает значение (или переменную) --- console.log() также ожидает выражение, но вы можете разбить его на несколько строк. ожидание значения не означает, что его нельзя поместить в другую строку. - person zerkms; 05.03.2014

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

http://encosia.com/in-javascript-curly-brace-placement-matters-an-example/

person JamesMarc    schedule 04.03.2014
comment
в том, что положение скобок имеет значение --- это не так. Позиция выражения имеет значение, а не фигурные скобки. - person zerkms; 05.03.2014
comment
Эти сообщения в блоге хорошо подводят итог, спасибо - возможно, мне придется пересмотреть свое форматирование. - person Rodney; 05.03.2014