2014-04-01 63 views
1

我有這段代碼覆蓋了XMLHttpRequest的發送函數。覆蓋XMLHttpRequest的發送函數

var sendOrig = XMLHttpRequest.prototype.send; 
XMLHttpRequest.prototype.send = function() { 
    var args = arguments; 
    var self = this; 

    setTimeout(function() { 

     // Do something. 

     self.addEventListener("readystatechange", function() { 
      if(this.readyState == 4) { 

       // Do something else. 

      } 
     }); 

     sendOrig.apply(self, args); 

    }, 0); 
} 

在這種情況下,事件監聽器是堆積起來還是會收集垃圾?如果不是,我將如何實現這一目標?

回答

0

每次調用XHR.send()時,都會創建一個新的函數作爲事件偵聽器。但是,如果你需要在處理程序中使用閉包(即你訪問自變量),這是唯一的方法。

當你使用它時,你應該確保清除存儲對XHR引用的每個屬性,以使垃圾收集從內存中正確清除處理程序。

var XHR = new XMLHttpRequest(); 
//... 
XHR.send(...); 
//... 
XHR = null; //not needed anymore - make sure GC can remove its handlers 
+1

我重寫的XMLHttpRequest的原因是因爲我想通過jQuery或其他一些庫中直接調用XMLHttpRequest的發送功能做一些事情,每次東西發送到服務器,無論是。我如何用你的代碼實現這個目標? – Strudel

+0

如果您希望在發送AJAX請求或收到響應之前/之後執行某些操作,那麼您的問題中包含正確的代碼。我的代碼只是爲了解釋如何在改變它之後使用XHR。如果您使用庫或框架(jQuery,ExtJS等),它們應該已經能夠正確使用它,並且應該沒有問題。 –

+0

無論如何,如果你使用框架,你應該看看它的文檔,以更好的方式來達到這個目的,而不是搞亂香草JS。例如,jQuery有很多AJAX事件可以使用:http://api.jquery.com/category/ajax/global-ajax-event-handlers/和ExtJs:http://www.objis.com/formationextjs /lib/extjs-4.0.0/docs/api/Ext.Ajax.html#events –