Вернуть переменную как свойство в 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 },
  ....
} 
Другие вопросы по тегам