2015-09-29 2 views
0
var groups; 

function findGroups { 
    getGroups().then(function (g) { 
    groups = g; 
    }); 
} 

function foo() { 
    var a = groups[0]; //or something along those lines. 
    //access the properties of `g` 
} 

Я хочу получить доступ к g в других функциях на всей странице, поэтому я назначил его глобальной переменной. У меня сложилось впечатление, что глобалы плохие. Как еще я мог бы это сделать?Как бы я реорганизовал этот javascript, чтобы не использовать глобальный?

Благодаря

Edit: getGroups() является вызов API. Я не хочу называть его несколько раз.

+4

Глобал только плохо, если вы используете их в неправильном направлении :) –

+0

Хорошо, так это то, что Глобал тогда правильно? Я делаю вызов API, чтобы получить «группы», и я использую их в нескольких функциях. Я не хочу, чтобы вызов API несколько раз. – NorCalKnockOut

+0

В чем проблема, с которой вам приходится сталкиваться, когда вы вызываете 'getGroups()' "* несколько раз *"? Потому что * чувствует * как отдельный вопрос к другому («* как я могу избежать [глобальных переменных]? *»). –

ответ

1

Если вам необходимо получить доступ к этой переменной accross несколько страниц, устанавливающих глобальное пространство имен может быть хорошим способом, чтобы пойти:

// file1.js (loaded first) 
myApp = {}; // global namespace 
(function() { 
    var groups = {}; 

    myApp.findGroups = function() { 
     return groups; 
    }; 

    // init groups 
    (function init() { 
     getGroups().then(function (g) { 
      groups = g; 
     }); 
    }()); 
}()); 

// file2.js (loaded next) 
myApp.findGroups(); // now myApp.groups is available 
+0

'getGroups()' это вызов API, который я не хочу делать несколько раз. Как я могу назвать это только один раз? – NorCalKnockOut

+0

@NorCalKnockOut Я отредактировал свой ответ, чтобы иметь блок init, поэтому «getGroups» запускается только один раз в начале выполнения –

1

Вы можете получить функцию закрытия, поэтому группы переменная будет локальным:

(function(){ 
    var groups; 

    function findGroups { 
     getGroups().then(function (g) { 
     groups = g; 
     }); 
    } 
})(); 
+0

Как получить доступ к свойствам 'g' в другой функции? – NorCalKnockOut

+1

Как это решение помогает OP? – MaxZoom

0

Или вы можете использовать объектно-ориентированный стиль:

var Group = { 
    groups: null, 
    findGroups: function() { 
     getGroups().then(function (g) { 
      Group.groups = g; 
     }); 
    }, 
    fetchGroup: function(index){ 
     return Group.groups[index]; 
    } 

}; 

Group.findGroups(); 
var group = Group.fetchGroup(index); 

Или с конструкцией или:

function Group(){ 
    this.groups = null; 
    var self = this; 
    this.findGroups = function() { 
     getGroups().then(function (g) { 
     self.groups = g; 
     }); 
    }; 
}; 

var group = new Group(); 
group.findGroups(); 
0

Возможно, у вас может быть только одна глобальная переменная, тогда вы можете получить доступ к данным через свой открытый интерфейс.

Пример:

var myLibrary; 

(function (lib) { 
    var groups; 
    function findGroups() { 
     getGroups().then(function (g) { 
      groups = g; 
     }); 
    } 
    function getLocalGroups() { 
     return groups; 
    } 

    //public interface 
    lib.findGroups = findGroups; 
    lib.getLocalGroups = getLocalGroups; 
}(myLibrary)); 
Смежные вопросы