Почему результаты зависят от расположения фигурных скобок?
Почему приведенные ниже фрагменты кода, взятые из этой статьи, дают разные результаты только из-за одного изменения размещения фигурных скобок?
Когда открывающая фигурная скобка {
находится на новой строке, 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" - не лучший подход. Раздел комментариев открыт, поэтому поделитесь своим мнением с другими.