代码之家  ›  专栏  ›  技术社区  ›  alumb

重写javascript中的全局函数

  •  8
  • alumb  · 技术社区  · 14 年前

    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 设置为新函数。

    有什么建议吗?



    2 回复  |  直到 14 年前
        1
  •  20
  •   Community CDub    8 年前

    这是因为你在用 命名函数表达式 ,在IE中实现不正确。删除函数名将解决直接问题。看到了吗 kangax excellent article on this subject

    通常,尝试重写宿主对象的属性(例如 window document 或者任何DOM元素),因为不能保证环境会允许它。宿主对象不受与本机对象相同的规则约束,本质上可以随心所欲。也不能保证宿主方法是 Function 对象,因此 oldSetTimeout 可能并不总是有 apply() 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);
    };
    
        2
  •  4
  •   Tim    12 年前

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