2010-07-07 18 views
0

我不是一个Javascript人正常的,但我一直在潜水,阅读Douglas Crockford's book,写一些琐碎的,有用的花絮作为Chrome扩展和Node.js(注意,这个问题是不是其中任何)。我试图找出如何保留一个对象的引用来启动一个AJAX请求,也就是说:一旦我设置了onload事件处理程序(这是来自Chrome扩展中,所以我'中号使用基XMLHttpRequest对象),是否有任何方式,我可以返回参考MyObject在下面的例子:Javascript:如何保留对处理程序中的请求发起者的引用?

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模式可以完全避免这个问题?

+1

我真的在晚上太晚了(读:醉酒)正确回答你的问题,但也许你可以享受这些文章:http://www.digital-web.com/articles/scope_in_javascript/和http: //www.quirksmode.org/js/this.html – 2010-07-07 20:47:07

+0

请参见[Function.prototype.bind](http://www.google.com/search?hl=zh-CN&q=function.prototype.bind&aq=f&aqi=&aql=&oq =&gs_rfai =)和http://stackoverflow.com/questions/3018943/javascript-object-binding-problem-inside-of-function-prototype-definitions/3019431#3019431 – Anurag 2010-07-07 21:24:45

+0

尽我所爱quirksmode.org,该链接实际上并不包括申请/电话,这是我所需要的(尽管第一个是这样)。谢谢! – 2010-07-07 21:45:40

回答

3

我不太清楚你想要引用哪个变量。这里是你将如何在你的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

确实这就是我想要的 - 我决定以这种方式分配处理程序:'this.Request.onload = function(event){responder.apply(selfReference,[event,this]); },以保留'XMLHttpRequestProgressEvent'和'XMLHttpRequest'。谢谢! – 2010-07-07 21:49:15

1

您是否尝试过...

this.Request.onload = this.ActionResultHandler.apply(this); 

我想这就是你要找的内容(抱歉,如果它不是)。使用.apply(this)将指向ActionResultHandlerObject

检查出this article绑定,而你在它!它帮了我很多。

+0

你的代码片段实际上将'this.Request.onload'设置为等于'this'的上下文中调用的'this.ActionResultHandler'的返回值。我不认为这是他想要完成的。 – lawnsea 2010-07-07 21:08:06

+0

好点,我不知道我在想什么... – bschaeffer 2010-07-07 21:27:25

+0

AFAIK,'this.ActionResultHandler'总是使用'this'的当前值绑定。但是,它在正确的轨道上,并且链接帮忙,谢谢! – 2010-07-07 21:51:58

相关问题