2010-07-07 25 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

相關問題