覆盖javascript中的全局函数

alu*_*umb 9 javascript overriding global settimeout

我试图将自己的错误处理添加到JavaScript setTimeout函数.以下代码在chrome中工作正常:

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);
}
Run Code Online (Sandbox Code Playgroud)

但在IE7中它变成了一个递归函数.由于某种原因oldSetTimeout设置为新功能.

有什么建议?



旁注:是的,我需要这样做.我正在使用一堆第三方库,所有这些库都不能很好地处理setTimeout,所以我不能只是将调用更改为setTimeout.

Tim*_*own 18

这是因为您正在使用在IE中错误实现的命名函数表达式.删除功能名称将解决紧急问题.看看kangax 关于这个主题优秀文章.但是,还有一个问题不容易解决.

通常,尝试覆盖宿主对象(例如window,document或任何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);
};
Run Code Online (Sandbox Code Playgroud)