Javascript - назначение нескольких переменных объектам с использованием фигурных скобок в объявлении переменных

При взгляде на некоторый код Javascript для SDK надстройки Mozilla (Firefox) я видел вид объявления переменных, которого я раньше не видел:

var { foo, bar } = someFunction("whatever");  // just an example

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

Я на самом деле нашел это через какую-то ворчание, поскольку на нем, похоже, нет документации. Взгляните на этот код:

function gimmeAnObject() {
    return {
        foo: "hey",
        bar: "sup"
    };
}

console.log(gimmeAnObject()); // Object { foo="hey", bar="sup" }

var { foo, bar } = gimmeAnObject();

console.log(foo); // hey
console.log(bar); // sup

Я также обнаружил, что это работает только в Firefox. Вместо этого Chrome выведет ошибку: "Uncaught SyntaxError: Неожиданный токен {". Это объясняет, почему я не видел его до того, как начал изучать дополнительный код Firefox.

Кто-нибудь еще видел такое объявление переменной раньше? Почему я не могу найти документацию? Поскольку он работает только в Firefox, я думаю, что это может быть Mozilla, но я даже не мог найти ничего об этом на MDN. Опять же, может быть, я просто не знал, что искать.

Ответ 1

Глядя на ссылки "Destructuring Assignment" (т.е. http://en.wikipedia.org/wiki/JavaScript_syntax#Assignment и http://dailyjs.com/2011/09/12/destructuring/), он выглядит Подобная конструкция представляет собой деструктурирующее назначение.

Википедия:

В Mozilla JavaScript, начиная с версии 1.7, назначение деструктуризации позволяет сразу назначить части структур данных нескольким переменным. Левая часть задания - это шаблон, который похож на произвольно вложенный литерал объекта/массива, содержащий l-lvalues ​​на его листах, которые должны получать подструктуры назначенного значения.

В JavaScript-массивах и объектах более или менее одинаковы, поэтому не удивительно, что конструкция, поддерживаемая для массивов, также поддерживается для объектов.

Ответ 2

Вы не можете этого сделать. Вы должны называть var и делать что-то вроде этого:

var myObj = (function(){
    return {
        foo: 'foo',
        bar: 'bar'
    };
})();