#javascript #backbone.js #requirejs #global-variables
#javascript #backbone.js #requirejs #глобальные переменные
Вопрос:
Я использую require.js и backbone.js . Я пытаюсь установить переменную, а затем использовать ее в нескольких представлениях по всему приложению, вызывая модуль, содержащий переменную с Require
помощью . Модуль является:
define(function (require) {
"use strict";
var variable_a = "aaa", variable_b ="bbb" ;
var some_variables = (function () {
return {
setVariableA: function (x) {
variable_a = x;
},
return_a: variable_a,
return_b: variable_b
};
})();
return some_variables;
});
На мой взгляд, я включаю модуль, а затем устанавливаю переменную, а затем проверяю, установлена ли она:
someVariables.setVariableA('456');
console.log('someVariables.return_a is ');
console.log(someVariables.return_a);
Но это возвращает "aaa"
, а не "456"
. Что я делаю не так?
Ответ №1:
Это очень распространенный факт с javascript. когда вы разделяете область, т.Е. пишете что-то вроде
(function(){ ... })()
эта дочерняя область получает копию всего из родительской области. Поскольку у вас есть примитивные типы данных (например string
, ) в родительской области, дочерняя область содержит копию примитивных данных. Таким образом, любые изменения, которые вы вносите в дочернюю область, не будут отражены в родительской области.
обходной путь заключался бы в изменении примитивных данных object
таким образом, чтобы дочерний элемент содержал ссылку. Например
define(function (require) {
"use strict";
var variables = {
a : "aaa",
b : "bbb"
};
var some_variables = (function () {
return {
setVariableA: function (x) {
variables.a = x;
},
return_variables: variables
};
})();
return some_variables;
});
и вызов будет изменен на
some_variables.setVariableA('456');
console.log('someVariables.return_a is ');
console.log(some_variables.return_variables.a);
Это даст вам 456
то, что вы ожидали.
Комментарии:
1. спасибо, это сработало после добавления «return some_variables;» в нижней части modelue. Можете ли вы добавить это, и я отмечу как правильное?
Ответ №2:
Использование
return_a: function() {
return variable_a;
},
return_b: function() {
return variable_b;
}
вместо
return_a: variable_a,
return_b: variable_b
поскольку текущие ‘return_a’ и ‘return_b’ всегда содержат начальные значения ‘variable_a’ и ‘variable_b’
Комментарии:
1. это не сработало. когда я делаю это так, консоль. log возвращает определение функции, а не переменную