Ваша проблема в том, что вы не пользуетесь закрытием. Строка id:id
создает новую переменную в качестве члена возвращаемого литерала объекта. Это имеет значение по умолчанию undefined
. Затем вы присваиваете себе ту же самую переменную id
, снова undefined
.
Кроме того, модуль - это отдельный экземпляр объекта, а не фабричная функция. Попробуйте что-то вроде этого:
var myModule = (function(opts) {
var foo = opts.foo || 0, //private variables with default values
bar = opts.bar || 0, // if none are passed in
product = function() { //private method
return (foo * bar);
};
return {
getFoo : function() { //public methods
return foo;
},
fooTimesBar : function() {
return product();
}
}
})({
foo : 5, //options object
bar : 7
});
Ядром шаблона модуля является самовыполняющаяся анонимная функция, которая объявляет переменные и затем возвращает объект, имеющий привилегированный доступ к этим переменным через замыкание .
Дополнительные символы в конце, в данном случае содержащие литерал объекта с некоторыми передаваемыми опциями, выполняют функцию, которая затем возвращает объект и присваивает его myModule
.
Все, что объявлено как член этого возвращаемого объекта, может быть открыто доступно. Код в возвращенном объекте имеет доступ к переменным, определенным в анонимной функции, посредством замыкания даже после того, как функция вернулась. Переменные, объявленные в анонимной функции, фактически являются закрытыми. Код вне функции не может адресовать их, кроме как через методы, предоставленные в возвращаемом объекте.
Все это приводит к одному экземпляру объекта в myObject
. Можно создать не более одного, что является определением модуля. Аналогичный подход может быть использован для создания фабричной функции.