2012-05-14 8 views
0

Я думал, что они эквивалентны.разница между {} и функцией() {}

var __Panel = { 
this.header = null; 
}; 

var __Panel = function() { 
this.header = null; 
}; 

Первый дает ошибку компилятора «ожидаемый идентификатор или строка» для this и «ожидаемый",»для ;.

Может кто-нибудь прояснить это немного для меня?

+3

Думаю, вам стоит потратить еще немного времени на [Руководство по JavaScript MDN] (https://developer.mozilla.org/en/JavaScript/Guide). Синтаксис литерала объекта вовсе не связан с синтаксисом функции. –

+0

Почему вы думаете, что это были эквиваленты?!? есть ли в обороте какая-либо книга или веб-страница, которая так говорит? – Aprillion

+0

@FelixKling - Я работаю над реализацией шаблона фабричного дизайна в javascript и немного подхватил здесь определение моего объекта в более общем виде и просто немного крутился вокруг. Я использовал оба определения до этого, но, как я думаю, сейчас я просто ушел. –

ответ

9

{} предназначен для определения объекта, а function(){} используется для определения функции.

Thos тело внутри {} должен быть ряд разделенных запятыми key: value пар, например:

var man = { 
    age: 24, 
    height: 6, 
    occupation: "programmer" 
}; 

Ваш пример не работает по трем причинам. Во-первых, this.header не является допустимым ключом, поскольку он содержит точку, :, а не = - это токен, используемый для разделения ключей от значений, а используется вместо ; для разграничения пар ключ-значение.

+4

Право; они даже не * близки * к эквиваленту. – Pointy

+2

, но никаких объяснений относительно * почему * 'this' не будет работать –

+1

Я думаю, что важно отметить, что они могут использовать __Panel для создания экземпляров __Panel. Например: 'var myPanel = new __Panel()'. Ключевое слово 'this' на самом деле означает что-то во втором случае, но не первое. – lbstr

1

Это один мне было интересно:

js> var p = { this.header = null; }; 
js: "<stdin>", line 11: invalid property id 
js: var p = { this.header = null; }; 
js: ..............^ 
js: "<stdin>", line 11: syntax error 
js: var p = { this.header = null; }; 
js: ..............................^ 

излишнего объяснение этого следует:

Это носорог предполагая ответ: this.header текста будет интерпретироваться как имущественный идентификатор, а также Идентификатор свойства недействителен. Итак, вы узнали, что { } - это объект, который «содержит» свойства, а имя свойства не может выглядеть как this.header. Вы можете пойти дальше и проверить синтаксис для «объекта»; это выглядит просто как { propertyId1 : value1, propertyId2 : value2, ...}.

js> var p = { header:0, doit: function(){this.header=null;} }; 

Это принято, на самом деле соблюдается «синтаксис объекта»; мы определили объект с двумя свойствами, header с целым числом 0 и doit, удерживая функцию.

Теперь вы можете задаться вопросом, почему существует {this.header=null;}; это потому, что вы не должны путать синтаксис объекта с использованием {}, чтобы «разграничить» «блок» кода, в этом случае «содержащий» самую функцию, ее код. Эти {} не представляют ту же самую вещь «голый» {}, и это становится ясно из-за присутствия function().

js> p.header; 
0 

Это показывает, что свойство header имеет 0, простой простой очевидный факт.

js> p.doit(); 

Это выполняет функцию, имевшихся в собственности doit. Чего мы ожидаем? Этот вопрос нисходит от вопроса, что такое this.

js> p.header; 
null 

Когда мы снова проверить содержание имущества header, мы видим, что изменяется в нуль. Это означает, что в функции в свойстве используется свойство doit - объект, содержащий «свойство», сам объект p.

Оригинал, удален, вики сообщества пост был:

Это один мне было интересно:

js> var p = { this.header = null; }; 
js: "<stdin>", line 11: invalid property id 
js: var p = { this.header = null; }; 
js: ..............^ 
js: "<stdin>", line 11: syntax error 
js: var p = { this.header = null; }; 
js: ..............................^ 
js> var p = { header:0, doit: function(){this.header=null;} }; 
js> p.header; 
0 
js> p.doit(); 
js> p.header; 
null 

Конец исходное сообщение

Все это отвечает на вопрос возможно, по-другому, по пути, молчаливым и неявным образом, что режим сообщества Wiki мог бы помочь в росте с более «говорящими примерами» (lear с использованием практики и интерпретации ошибок).

Но это не было «пойманным», и были добавлены явные «дедуктивные» шаги.

+0

Как это ответить на вопрос? – zzzzBov

+0

Если вы можете расширить, почему «это было интересно», то флаг для восстановления. – Kev

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