使用Require.js设置和获取全局变量

时间:2014-06-20 10:59:14

标签: javascript backbone.js requirejs global-variables

我使用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"。我做错了什么?

2 个答案:

答案 0 :(得分:0)

使用

 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 :(得分:0)

这是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