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

Setting and getting global variable with Require.js

本文关键字:获取 全局变量 设置 Require js      更新时间:2023-09-26

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

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

使用

 return_a: function() {
      return variable_a;
 },
 return_b: function() {
      return variable_b;
 }

代替

return_a: variable_a,
return_b: variable_b

因为current 'return_a'和'return_b' 总是保留'variable_a'和'variable_b'的初始值