2010-09-28 115 views
7

我想將自己的錯誤處理添加到JavaScript setTimeout函數中。下面的代碼可以在Chrome中正常工作:在JavaScript中重寫全局函數

var oldSetTimeout = window.setTimeout; 
window.setTimeout = function setTimeout(func, delay) { 
    var args = Array.prototype.slice.call(arguments, 0); 
    args[0] = function timeoutFunction() { 
     var timeoutArgs = Array.prototype.slice.call(arguments, 0); 
     try { 
      func.apply(this,timeoutArgs); 
     } 
     catch (exception) { 
      //Do Error Handling 
     } 
    } 
    return oldSetTimeout.apply(this, args); 
} 

但是在IE7中,它變成了一個遞歸函數。由於某種原因,oldSetTimeout被設置爲新功能。

有什麼建議嗎?



側面說明:是的,我需要做的是這樣的。我正在使用一堆第三方庫,所有這些庫都不能很好地處理setTimeout,所以我不能只是將調用更改爲setTimeout。

回答

16

這是因爲您使用命名的函數表達式,它們在IE中不正確實現。刪除函數名稱將解決當前的問題。請參閱kangaxexcellent article on this subject。但是,還有一個問題不容易解決。

通常,嘗試覆蓋主機對象的屬性(例如windowdocument或任何DOM元素)並不是一個好主意,因爲不能保證環境允許它。主機對象不受本地對象相同的規則約束,本質上可以做他們喜歡的事情。也不能保證主機方法將是一個Function對象,因此oldSetTimeout可能並不總是有一個apply()方法。這是IE中的情況,所以撥打oldSetTimeout.apply(this, args);將不起作用。

我建議不要使用以下:

window.oldSetTimeout = window.setTimeout; 

window.setTimeout = function(func, delay) { 
    return window.oldSetTimeout(function() { 
     try { 
      func(); 
     } 
     catch (exception) { 
      //Do Error Handling 
     } 
    }, delay); 
}; 
3

未愈添下的應答模仿甚至原來多:

window.oldSetTimeout = window.setTimeout; 
window.setTimeout = function(func, delay) { 
    return window.oldSetTimeout(function() { 
     try { 
      func(); 
     } 
     catch (exception) { 
      //Do Error Handling 
     } 
    }, delay); 
}; 
+0

好一點。我改變了我的答案;我希望你不介意。 – 2013-12-11 12:21:18

+3

大聲笑,但現在有答案說相同>:| – 2015-02-15 08:25:45