我正在使用 require.js 和backbone.js。我试图设置一个变量,然后通过使用 Require
调用包含该变量的模块,在整个应用程序的多个 View 中使用它。该模块是:
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
),因此子作用域保存原始数据的副本。因此,您在子作用域中所做的任何更改都不会反射(reflect)在父作用域中。
解决方法是将原始数据更改为对象
,以便子对象保留引用。例如
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
。
关于javascript - 使用 Require.js 设置和获取全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24325722/