Почему результаты зависят от расположения фигурных скобок?

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

Когда открывающая фигурная скобка { находится на новой строке, test() возвращает undefined, и в предупреждении отображается "нет - сломано: неопределенное".

function test()
{
  return
  { /* <--- curly brace on new line */
    javascript: "fantastic"
  };
}

var r = test();
try {
  alert(r.javascript); // does this work...?
} catch (e) {
  alert('no - it broke: ' + typeof r);
}

Ответ 1

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

function test()
{
  return; // <- notice the inserted semicolon
  { 
    javascript: "fantastic"
  };
}

См. Также руководство по стилю Douglas Crockford JS, в котором упоминается вставка точек с запятой.

Во втором примере вы возвращаете объект (построенный с помощью фигурных скобок) со свойством javascript и его значением "fantastic", фактически таким же, как это:

function test() {
    var myObject = new Object();
    myObject.javascript = "fantastic";
    return myObject;
}

Ответ 2

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

Пример из моего сообщения в блоге об этом (Javascript - почти не основанный на линии):

Если вы отформатируете код следующим образом:

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

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

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

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

То же самое происходит с вашим кодом. Функция интерпретируется как:

function test()
{
  return;
  {
    javascript : "fantastic"
  };
}

Ответ 3

Это потому, что javascript чаще всего ставит ";" в конце каждой строки, так что, когда вы возвращаетесь {в той же строке, движок javascript видит, что будет что-то еще, и когда его в новой строке думает, что вы забыли поставить ";" и поместили его для вас.

Ответ 4

Здесь фигурные фигурные скобки обозначают конструкцию нового объекта. Таким образом, ваш код эквивалентен:

function test() {
  var a = { javascript : "fantastic" };
  return a;
}

который работает, если вы пишете:

function test() {
  var a = { javascript : "fantastic" };
  return; // ; is automatically inserted 
      a;
}

он больше не работает.

Ответ 5

Проблема заключается в том, что инъекция с запятой, как описано выше. Я просто прочитал хороший блог на эту тему. Это объясняет эту проблему и многое другое о javascript. Он также содержит несколько хороших ссылок. Вы можете прочитать его здесь

Ответ 6

Я лично предпочитаю стиль Allman для удобочитаемости (vs K & R style).

Вместо...

function test() {
  return {
    javascript : "fantastic"
  };
}

Мне нравится...

function test() 
{
  var obj =
  {
    javascript : "fantastic"
  };

  return obj;
}

Но это обход. Я могу жить с ним, хотя.

Ответ 7

Исключая стандартную причину return;.

Скобки в новых строках BAD HABBITS, взятые из других C-образных лагунгов, где это стандарт. Если читабельность является причиной, то мы также можем предоставить это имя переменной, написанное в вашем собственном laguange, но мы этого не делаем, правильно? Новые линейные скобки ARE BAD HABBITS, а также, например, в google chrome, отображаются как ошибки debbuger.

Когда вы работаете с командами, существует 99% вероятность того, что новая строка { будет запрещена из-за IDE, которые автоматически сохранят код. Как WebStorm/VisualStudio.

Когда вы посмотрите на github, вы увидите, что наиболее популярным является { в той же строке. (Если вы найдете другую версию, укажите пример)

Кроме того, каждая строка кода должна иметь значение в laguanges, которые в основном интерпретируются не скомпилированными. Как бы вы "объяснили", чтобы intrereter строку, которая начинается с:

 {

? это начало блока? Думаю, вы сказали yes. Теперь скажите мне, сколько вы можете сказать о:

function foo() { 

(конечно, мы говорим о неминифицированных файлах, для которых также мы сохраняем мало памяти)

Мне не нравится заставлять inteprer смотреть вперед/назад. Он должен читать строку и делать то, что находится в строке не в двух строках.

Я уверен, что ECMA 202X добавит его как СТАНДАРТ. Мне все равно, кто-то делает это в своих проектах, но как человек, который работает в основном с TEAMS программистов, я бы не принял этот код hipsterizing.

В следующем случае будет добавлено, как CoffeScript/ TypeScript и другие диалекты. Эти инструменты вернут вам код с { с той же строкой. Зачем? Постарайтесь, как это должно быть сделано.

ИЗМЕНИТЬ:

Я углубился в мои исследования об этом, и я связался с командой ECMA.

Здравствуйте, я уверен, что я, вероятно, не буду отвечать за это. Но я хотел бы знать, что предпочитает команда ECMA. Какие фигурные скобки в javascript будут написаны в одной строке или в новой строке? (за исключением примера с условием "return;" и автоматической точкой с запятой. Я пишу свою диссертацию, и ваше сообщение будет настолько полезно, как некоторый профессионал POINT OF VIEW. Спасибо за огромную работу.

as Answere Я получаю это:

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

edit: Я знаю, что некоторые люди разочарованы тем фактом, что они делают что-то неправильно, но предоставление "-1" - не лучший подход. Раздел комментариев открыт, поэтому поделитесь своим мнением с другими.