我不是一个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模式可以完全避免这个问题?
我真的在晚上太晚了(读:醉酒)正确回答你的问题,但也许你可以享受这些文章:http://www.digital-web.com/articles/scope_in_javascript/和http: //www.quirksmode.org/js/this.html – 2010-07-07 20:47:07
请参见[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
尽我所爱quirksmode.org,该链接实际上并不包括申请/电话,这是我所需要的(尽管第一个是这样)。谢谢! – 2010-07-07 21:45:40