我通常不是一个 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
引用的内容),但考虑到面向对象的Javascript和AJAX实际上是在任何地方,这都必须是一个已知的、简单的问题,但我的 Google-fu 在这里让我失望。在 C# 中,事件是在附加事件的上下文中调用的,而不是在触发事件的对象的上下文中调用,因此这种情况不会每天都会出现。也许有更好的 JS 模式可以完全避免这个问题?
最佳答案
我不太清楚你想要保存哪个变量的引用。下面介绍了如何在 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,因此我调整了代码来执行此操作。
关于Javascript:如何在处理程序中保留对请求发起者的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3198264/