【问题标题】:overriding a global function in javascript覆盖javascript中的全局函数
【发布时间】:2010-09-28 17:12:31
【问题描述】:

我正在尝试将我自己的错误处理添加到 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);
}

但在 IE7 中它变成了递归函数。出于某种原因,oldSetTimeout 被设置为新功能。

有什么建议吗?



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

【问题讨论】:

    标签: javascript overriding global settimeout


    【解决方案1】:

    这是因为您使用了命名函数表达式,在 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);
    };
    

    【讨论】:

    • 现在是 2019 年,仍然存在并且具有压倒性的全局功能,应该避免使用它。我根本不想支持任何 IE 版本。我只在最新的 Firefox 中测试了一些,效果很好。
    • @redanimalwar:一般来说,我仍然建议不要重写内置函数和宿主方法,因为所有代码都依赖它们。也就是说,与 2010 年相比,现在对宿主方法的行为进行了更详细的规定,因此现在重写它们通常更安全。
    【解决方案2】:

    对 Tim Down 的答案进行了小幅改进,以更加模仿原作:

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

    【讨论】:

    • 好点。我改变了我的答案;希望你不要介意。
    • @Meetai.com 嗨!您应该发表评论甚至是编辑建议,但不是答案:( more info
    • @CarlesAlcolea:我们尝试过,但它会完全消除代码格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2017-06-28
    • 2012-05-03
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多