我正在尝试覆盖 clearTimeout 函数,该函数在IE以外的所有浏览器中都能正常运行(在IE8中测试)
clearTimeout = function(){};
IE8出现以下错误:
Object doesn't support this action
但是当我这样做时,
window.clearTimeout = function(){};
它可以完美地覆盖clearTimeout。为什么会出现这种情况?
此外,在我的代码中,我直接调用 clearTimeout 而不是 window.clearTimeout 。因此,即使我覆盖clearTimeout(通过第二种方式),也会调用本机clearTimeout而不是重写的clearTimeout。什么可以解决这个问题?
答案 0 :(得分:0)
在IE中,最初,属性setTimeout存在于原型上 窗户,而不是窗户本身。所以,当你要求window.setTimeout时, 它实际上遍历原型链上的一步来解决问题 参考。同样,当您请求setTimeout时,它会向下遍历 范围链,然后到窗口,然后下来原型链到 解决参考。
我怀疑IE有自动内置优化功能 缓存所有发现的隐含全局变量的分辨率 在全局对象的原型上。它会很好 这样做的原因,因为这些是通常要求的参考,和 遍历这条链是昂贵的。但是,必须设置它 引用为只读,因为它只是一个缓存优化。这个 有引起异常的不幸副作用 尝试使用它作为左值分配给引用时。
来源:http://www.adequatelygood.com/2011/4/Replacing-setTimeout-Globally