Установка и получение глобальной переменной с Require.js

#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 возвращает определение функции, а не переменную