我使用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'的初始值