2017-01-09 2 views
3

Я пытаюсь вернуть набор переменных после инициализации 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, но не получил никакой информации о том, почему не будет надлежащей ссылки на частную переменную.

ответ

3

Я думаю, вы хотели написать localInformation в своем возвращенном объекте.

Проблема в том, что вы переписываете имя переменной localInformation в новый объект.

localInformation = _demoAPICall() 

Это означает, что ваши InfoProp свойство указывает на начальное значение localInformation (пустой объект), в то время как внутри функции, вы получите последнюю ценность localInformation.

У вас есть два варианта:

1) Расширить существующий объект вместо назначения имени переменного на новый:

extend(localInformation, _demoApiCall()) 

Вы Cann использование JQuery расширит, Ot один из lodash, или любая другая реализация будет выполнена.

2) использовать метод получения

return { 
    Init: Init, 
    get InfoProp() { return information }, 
    .... 
} 
+0

Я хотел написать 'localInformation', однако я обновил свой пример, чтобы иметь код работает. Я никогда не видел ключевое слово 'get' в возврате, оно обязательно будет использовать его, если оно будет работать. Не могли бы вы объяснить, что это делает, это более маниакально, чем предлагает? – TheGeekZn

+1

MDN объясняет это лучше, чем я когда-либо мог: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get – lordvlad

+0

Похоже, вы не можете использовать 'get' перед именем ссылки , Это в основном работает для меня, если я использую его следующим образом: 'Context: {get Current() { обратный ток; }} ' – TheGeekZn