当d3
调用回调函数时,this
似乎设置为窗口。
我如何设置模块级变量,例如,JSON响应回调?
在下面的示例中,MODULE.Submodule.bar
已设置,但MODULE.Submodule.foo
不是
var MODULE = MODULE || {};
MODULE.Submodule = (function(){
var foo = [],
bar = [];
var init = function() {
d3.json('path_to_file.json', set_globals);
}
var set_globals = function(error, json) {
this.foo = ['a','b','c']; // 'this' doesn't point to MODULE.Submodule
bar.push('a');
console.log('foo: ' + MODULE.Submodule.foo); // foo:
console.log('bar: ' + MODULE.Submodule.bar); // bar: a
}
return {
init: init,
foo: foo,
bar: bar
}
}());
MODULE.Submodule.init();
我考虑过透露set_globals
,然后将d3.json
的回调转换为this.set_globals
,但这并不重要。
我还尝试过在this
之前删除this.foo = ['a','b','c'];
,但情况也不差。
答案 0 :(得分:0)
这样就可以了。如果需要,它可以通过使用扩充动态创建父MODULE
来设置清理工作。
var MODULE = (function (module) {
var sub = module.Submodule = module.Submodule || {
foo: [],
bar: [],
init: function () {
d3.json('path_to_file.json', set_globals);
}
};
function set_globals(err, json) {
sub.foo = ['a', 'b', 'c'];
sub.bar.push('a');
}
return module;
}(MODULE || {}));
然后只需像以前一样调用MODULE.Submodule.init()
。