为什么IE8上的b / w window.clearTimeout和clearTimeout存在差异?

时间:2012-11-01 13:13:12

标签: javascript internet-explorer override

我正在尝试覆盖 clearTimeout 函数,该函数在IE以外的所有浏览器中都能正常运行(在IE8中测试)

clearTimeout = function(){};

IE8出现以下错误:

Object doesn't support this action

但是当我这样做时,

window.clearTimeout = function(){};

它可以完美地覆盖clearTimeout。为什么会出现这种情况?

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

1 个答案:

答案 0 :(得分:0)

  

在IE中,最初,属性setTimeout存在于原型上   窗户,而不是窗户本身。所以,当你要求window.setTimeout时,   它实际上遍历原型链上的一步来解决问题   参考。同样,当您请求setTimeout时,它会向下遍历   范围链,然后到窗口,然后下来原型链到   解决参考。

     

我怀疑IE有自动内置优化功能   缓存所有发现的隐含全局变量的分辨率   在全局对象的原型上。它会很好   这样做的原因,因为这些是通常要求的参考,和   遍历这条链是昂贵的。但是,必须设置它   引用为只读,因为它只是一个缓存优化。这个   有引起异常的不幸副作用   尝试使用它作为左值分配给引用时。

来源:http://www.adequatelygood.com/2011/4/Replacing-setTimeout-Globally