Три важных понятия: анонимные функции, литералы объектов, замыкание.
Анонимные функции
Вы можете объявлять и выполнять функцию, не назначая ее переменной. В вашем примере foo - это не функция, это результат вызова:
var item = function(){ /*function code here*/ }**()**;
<- Поскольку функция выполняется, элемент - это объект, который возвращает функция, а не функция. </p>
Литералы объектов
Скажем, вы сделали это: var a = new Object(); a.foo = 'bar';
Буквенное обозначение объекта будет выглядеть так: var a = {foo: 'bar'};
В вашем примере ваша анонимная функция возвращает новый объект с двумя функциями, P1 и P2. Это просто другое обозначение для определения объектов.
Закрытие
Когда функция возвращает объект, этот объект сохраняет доступ к области действия функции - это называется закрытием. Итак, если вы сделаете это:
var a = function(){
var _pvt = 'foo';
return {
aFunc: function(){alert(_pvt);}
};
}();
a.aFunc();
_pvt
является анонимной функцией. Эта функция возвращает новый объект одним методом (aFunc
). Область действия анонимной функции доступна этому объекту через замыкание, поэтому при вызове a.aFunc()
будет доступно _pvt
.
Лучшее место, чтобы узнать об этом - видео Дугласа Крокфорда на YUI Theatre: http://video.yahoo.com/watch/111585/1027823