我通常不是Javascript人员,但我一直在潜水,阅读Douglas Crockford's book,并将一些微不足道的有用花絮写成Chrome扩展程序和Node.js(请注意,此问题不是'关于他们中的任何一个)。
现在,我正在试图弄清楚如何保留对启动AJAX请求的对象的引用,即:一旦我设置了onload事件处理程序(这是来自Chrome扩展内部,所以我是使用基础XMLHttpRequest对象),有什么方法可以在以下示例中引用回MyObject
:
MyObject.prototype = {
PerformAction: function() {
this.Request = new XMLHttpRequest();
this.Request.open("GET", this.ConstructUrl(), true);
// From within ActionResultHandler, 'this' will always be the XMLHttpRequest
this.Request.onload = this.ActionResultHandler,
this.Request.send(null);
}
}
这样做的确是将this
指定为请求对象本身,如果我只是介绍一个包装器:
this.Request.onload = function() { ActionResultHandler() };
好吧,那就是不会做任何事情,因为ActionResultHandler现在已经超出了范围。我在这里问的原因是因为我只发现了调用者操作的微不足道的情况(例如,操纵函数内部this
引用的内容),但鉴于OO-ified Javascript和AJAX几乎无处不在,必须是一个已知的,简单的问题,但我的谷歌在这里失败了。在C#中,事件是在附加到它们的人的上下文中调用的,而不是触发事件的对象,因此这不会每天出现。也许有一个更好的JS模式可以完全避免这个问题?
答案 0 :(得分:4)
我不清楚你想要引用哪个变量。以下是在onload处理程序中保留对MyObject
的引用的方法:
MyObject.prototype = {
PerformAction: function() {
var MyObjectRef = MyObject,
ActionResultHandler = this.ActionResultHandler;
this.Request = new XMLHttpRequest();
this.Request.open("GET", this.ConstructUrl(), true);
// From within ActionResultHandler, 'this' will always be the XMLHttpRequest
this.Request.onload = function () {
ActionResultHandler.apply(MyObjectRef, arguments);
};
this.Request.send(null);
}
}
<强>被修改强>
好的,我再次重读你的问题,似乎你想在MyObject的上下文中执行ActionResultHandler,所以我调整了我的代码来做到这一点。
答案 1 :(得分:1)
你试过......
this.Request.onload = this.ActionResultHandler.apply(this);
我在想这就是你要找的东西(对不起,如果不是这样的话)。使用.apply(this)
会将ActionResultHandler
指向Object
。
查看this article关于绑定的信息!它帮助了我很多。