我正在使用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"
。我做错了什么?
发布于 2014-06-20 06:06:26
对于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
。
发布于 2014-06-20 04:24:22
使用
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‘的初始值
https://stackoverflow.com/questions/24325722
复制