1

我正在尝试覆盖clearTimeout函数,该函数在除 IE 之外的所有浏览器中都可以正常工作(在 IE8 中测试)

clearTimeout = function(){};

IE8 给出以下错误:

Object doesn't support this action

但当我这样做时,

window.clearTimeout = function(){};

它可以很好地覆盖 clearTimeout。为什么会出现这种行为?

此外,在我的代码中,我直接调用clearTimeout而不是window.clearTimeout。因此,即使我覆盖 clearTimeout(通过第二种方式),也会调用本机 clearTimeout 而不是覆盖的 clearTimeout。什么可以解决这个问题?

4

1 回答 1

0

在 IE 中,属性 setTimeout 最初存在于窗口的原型上,而不是窗口本身。因此,当您请求 window.setTimeout 时,它实际上会遍历原型链上的一步来解析引用。同样,当您请求 setTimeout 时,它会沿着作用域链向下遍历,然后到窗口,然后沿着原型链向下遍历以解析引用。

我怀疑 IE 有一个内置的优化,它会自动缓存隐含全局变量的分辨率,这些全局变量在全局对象的原型上一直被发现。这样做是有充分理由的,因为这些是通常要求的参考,并且遍历该链的成本很高。但是,它必须将此引用设置为只读,因为它只是一个缓存优化。这具有不幸的副作用,即在尝试通过将引用用作左值来分配引用时引发异常。

资料来源: http: //www.adequatelygood.com/2011/4/Replaceing-setTimeout-Globally

于 2013-03-10T18:28:29.917 回答