Вернуть переменную как свойство в IIFE
Я пытаюсь вернуть набор переменных после инициализации IIFE в качестве свойства. Проблема в том, что если я связываю переменную напрямую, я получаю пустой объект. Если я свяжу это с помощью функции, я получу желаемый результат.
var Application = (function(){
var localInformation = {};
function init(){
localInformation = _demoApiCall();
}
function _demoApiCall(){
// Pretend this method isn't here, and returns a complex object
return {
name: "Demo"
}
}
function doWork(){
// localInformation is properly structured here if called
}
return {
Init: init,
DoWork: doWork,
InfoProp: localInformation, // returns {}
InfoMethod: function(){
return localInformation; // returns {name:"demo"}
}
}
})();
Application.Init();
console.log(Application.InfoProp);
console.log(Application.InfoMethod());
После первоначального звонка Application.Init()
на документ готов, пример будет работать, только если я позвоню var inf = Application.InfoMethod()
Однако было бы намного чище, если бы я мог позвонить var info = Application.InfoProp
,
Я пытался прочитать о JS Closures, но не получил никакой информации о том, почему не будет правильной ссылки на приватную переменную.
1 ответ
Я думаю, ты хотел написать localInformation
в вашем возвращенном объекте.
Проблема в том, что вы переназначаете localInformation
имя переменной для нового объекта.
localInformation = _demoAPICall()
Это означает, что ваш InfoProp
свойство указывает на начальное значение localInformation
(пустой объект), в то время как внутри функции вы получаете последнее значение localInformation
,
У вас есть два варианта:
1) Расширить существующий объект вместо присвоения имени переменной новому:
extend(localInformation, _demoApiCall())
Вы не можете использовать расширение jQuery, от lodash, или любую другую реализацию.
2) использовать метод получения
return {
Init: Init,
get InfoProp () { return information },
....
}