2013-06-18 2 views
1

Я немного смущен относительно следующих форматов скобка в Javascript:Javascript Формат скобка

(listeners = {})[obj._listenerId] = obj; 

что это значит, когда объект окружен скобкой?

же для следующего

({ 
    value: "\\abc" 
}) 

другой вопрос - какой смысл в файл, который содержит только этот код? Спасибо! Mary

+0

* «что есть смысл в файл, который содержит только этот код» * Он не имеет особый смысл. Он немного похож на сломанный вызов функции, например. JSONP без имени функции. –

+0

Второй пример - это файл, прикрепленный к фреймворку mustache.js, называемый backslashes.js - там есть другие подобные примеры, что все, что они делают, это объявлять объявления объектов круглыми скобками. – mary

+0

Тогда он может быть использован только для оценки файла как JavaScript. Без круглой скобки '{...}' будет оцениваться как * block *, а не как литерал объекта, и это приведет к синтаксической ошибке. Это снова оператор группировки, но используется для обеспечения того, чтобы «контент» оценивался как выражение. Он не используется для изменения порядка оценки. –

ответ

3

Скобки - это grouping operator. С их помощью вы можете изменить порядок оценки выражения.

Что (listeners = {})[obj._listenerId] = obj; делает:

  1. Назначают пустой объект listeners.
  2. Присвоить значение obj собственности obj._listenerId этого объекта.

Без скобок, выражение будет оценено как (здесь я использую скобку только подчеркнуть порядок оценки):

listeners = ({}[obj._listenerId] = obj); 

т.е.

  1. Присвоить obj свойству obj._listenerId пустого объекта.
  2. Назначить obj по адресу listeners (результатом присвоения является назначенное значение).

Я уверен, вы уже знаете, оператор группировки из математических выражений. 1 + 2 * 3 приведет к 7. Но (1 + 2) * 3 is 9. * имеет более высокий приоритет, чем +, и вы можете изменить его с помощью группировки.

MDN предоставляет table of operators в порядке их очередности.

4

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

Таким образом, ваша линия эквивалентна

listeners = {}; 
listeners[obj._listenerId] = obj; 

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

+0

Спасибо! Это отвечает первой части. У вас есть ссылка, которая указывает этот синтаксис в JavaScript? – mary

+0

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

0

Скорлупа используется так, чтобы часть внутри них была оценена первой. Например, (listeners = {}) вернет новый пустой объект для прослушивателей.

0

это краткое обозначение:

listeners = {}; 
listeners[obj._listenerId] = obj; 

вы можете попробовать это:

(sameObj={})['key']='value'; 
console.log(sameObj)