Извините, если на этот вопрос уже был дан ответ, но я не смог найти подходящий ответ здесь.
В последнее время я начал писать свой код JavaScript в модульном стиле, и у меня возник вопрос относительно того, как переменная модуляscope работает.
Следующий код дает мне противоречивый ответ.
У меня есть модуль с именем Base, который объявляет две строки и массив.Он также имеет функцию fetchData, которая использует ярлык jQuery getJSON для установки этих переменных с данными сервера.К сожалению, когда я спрашиваю у Base1 string1 или string2, я получаю неопределенный.Я понимаю, что это, вероятно, связано с тем, что я установил их значения двумя функциями глубоко (внутри обратного вызова AJAX и внутри fetchData), и область видимости ограничивает его от просмотра Base.string1 и Base.string2.
Однако, когда я смотрю на Base.array1 снаружи модуля, он настроен на соответствующие данные, которые я извлек с сервера, даже если он установлен в той же области, что и строки.
Вот код:
namespace.Base = (function(){
var string1, string2, array1 = [];
function fetchData(){
$.getJSON('backendScript.php', function(data){
string1 = data.string1;
string2 = data.string2;
arrayCount = data.arr.length;
for(var i = 0; i<arrayCount; i++){
array1[i] = data.arr[i];
}
})
}
return{
fetchData: fetchData,
string1: string1,
string2: string2,
array1: array1
}
})();
Если я изменю
string1 = data.string1;
на
namespace.Base.string1 = data.string1;
, он будет работать так, как я хочу.
Так что мой вопроспочему массив1 установлен правильно, если он установлен в той же области видимости, что и строки?
Кроме того, каково средство для установки переменных уровня модуля из функций модуля без необходимости указывать глобальный путь (например,namespace.Base.string1)