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