Javascript 如何在使用d3.json事件处理程序时正确控制上下文

Javascript 如何在使用d3.json事件处理程序时正确控制上下文,javascript,json,d3.js,anonymous-function,Javascript,Json,D3.js,Anonymous Function,我正在尝试在自执行匿名函数中使用d3.js实现一个异步请求 我没有说d3.json(url,callback),而是使用d3.json(url)首先创建请求对象,然后使用xhr.on注册一个“加载”事件侦听器,然后使用xhr.get启动请求 下面是一个例子,在我的对象中有一个渲染函数,它可以渲染图表。从API加载数据后,我想调用此渲染函数。 调用是正确的,但在我的渲染函数中,我无法调用我的parseData函数。似乎我已经失去了这个上下文 控制台引发此异常:未捕获类型错误:this.parseD

我正在尝试在自执行匿名函数中使用d3.js实现一个异步请求

我没有说
d3.json(url,callback)
,而是使用
d3.json(url)
首先创建请求对象,然后使用
xhr.on
注册一个“加载”事件侦听器,然后使用
xhr.get
启动请求

下面是一个例子,在我的对象中有一个渲染函数,它可以渲染图表。从API加载数据后,我想调用此渲染函数。 调用是正确的,但在我的渲染函数中,我无法调用我的
parseData
函数。似乎我已经失去了
这个
上下文

控制台引发此异常:
未捕获类型错误:this.parseData不是函数

我做错什么了吗?谢谢

(函数(){
变量绘图仪={
渲染:函数(jsondata){
this.parseData(jsondata);//引发错误的位置
//画线图
// ....
},
parseData:函数(数据){
控制台日志(数据);
},
init:function(){
这是bindEvents();
},
bindEvents:function(){
var self=这个;
d3.json(this.DATAURL)
.on(“加载”,此.render)
.on(“error”,函数(error){console.log(“failure!”,error);})
.get();
}
Ploter.init();
})();

您可以将函数包装到另一个函数中,创建闭包,而不是直接传递函数。内部函数将能够引用存储在
self
中的值,该值指的是您要查找的原始
绘图仪

bindEvents: function() {
    var self = this;
    d3.json(this.DATAURL)
        .on("load", function(data) { self.render(data); })

谢谢,闭包解决了我的问题。我只是不清楚为什么上下文丢失。它与
get()有关吗
?@michael感谢您的编辑建议-注意到我自己错过了它,试图更改它,Stack Overflow said告诉我,我没有做足够的更改来改进它!!也许您建议的编辑与我的相冲突,但这似乎是错误的crazy@Michael我还打算将其添加到答案中,基本上是在回调中,
this
引用底层的
d3.xhr
对象。
render
函数没有对包含它的对象的引用,它只是一个匿名函数,您已分配给对象的
render
属性。当调用
x.myFunc()时
,它将
x
分配给
myFunc()
中的
this
,但当它作为回调调用时,就像在代码中一样,它相当于调用
xhr.render(data)
…希望这会让sensethaks变得更为敏感,这正是我所寻找的