2010-09-04 3 views
61

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

Пример с открывающей фигурной скобкой { на новой линии.

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

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

test() возвращается undefined.

Пример с открывающей фигурной скобкой { на той же линии, что и return.

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

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

test() возвращает объект.

ЖЖ: пример beware of curly braces.

+0

семантика sem-insert после 'return' немного отличается от других, а разрыв строки« означает больше »в этом месте, чем« средний поток ». – dandavis

ответ

90

Это одна из подводных камней javascript: автоматическая точка с запятой. Линии, которые не заканчиваются точкой с запятой, но может быть конец заявления автоматически прекращается, так что ваш первый пример эффективно выглядит следующим образом:

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

Смотрите также http://javascript.crockford.com/code.html

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

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

+1 'автоматическая точка с запятой javascript' –

+0

Точно верно. У Crockford есть видео с googletalk на youtube, где он очень ясно иллюстрирует это. – Rich

+4

Веселый факт: на некоторых двигателях вы можете прокомментировать запятую с запятой –

1

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

+1

Не понимаю, почему ответы Цичи, Дарина и Иво были опущены? – BoltClock

1

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

+0

Да, я также читал, что, прочитав чтение, я спрашиваю здесь, чтобы лучше объяснить вдохновителем js. – JustLearn

1

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

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

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

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

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

5

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

Пример из моего сообщения в блоге об этом (Javascript – almost not line based):

При форматировании кода:

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

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

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

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

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

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

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

Вместо того, чтобы ...

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

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

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

    return obj; 
} 

Но это работа вокруг. Я могу жить с ним, хотя.

+1

Я думаю, что мы должны избегать личных предпочтений, которые отклоняются от мейнстрима. Мы должны следовать выборам большинства, что способствует согласованности, что повысит читаемость. – Jowen

+0

Я нахожу его код более читаемым, чем K & R. Довольно субъективно, когда вы имеете в виду «читаемый» – Bran

-3

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

Кронштейны в новых строках: ПЛОХИЕ ХАББИТЫ взяты из других C-образных лагунгов, где это стандарт. Если читабельность является причиной, то мы также можем предоставить это имя переменной, написанное в вашем собственном laguange, но мы этого не делаем, правильно? Новые линейные скобки ARE BAD HABBITS, а также, например, в google chrome, отображаются как ошибки debbuger.

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

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

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

{ 

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

function foo() { 

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

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

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

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

EDIT:

я пошел глубже моего исследования о нем, и я связался с командой ECMA сам себе

Здравствуйте, я уверен, что я, вероятно, не получите answere об этом. Но я хотел бы знать, что предпочитает команда ECMA. Какие фигурные скобки в javascript будут написаны в одной строке или в новой строке? (За исключение примера с «возвращение;» Постулаты и автоматическая вставка с запятой, я пишу диссертацию, и ваше сообщение будет так полезно, как некоторая PROFESIONAL ТОЧКА ЗРЕНИЯ Спасибо за AWSOME работы

в Answere I... получить это:.

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

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

Смежные вопросы