我正在尝试重写clearTimeout函数,该函数在除IE之外的所有浏览器中均能正常工作(在IE8中测试)

clearTimeout = function(){};


IE8给出以下错误:

Object doesn't support this action


但是当我这样做时

window.clearTimeout = function(){};


它可以很好地覆盖clearTimeout。为什么会这样?

另外,在代码的任何地方,我都直接调用clearTimeout而不是window.clearTimeout。因此,即使我重写clearTimeout(通过第二种方法),也会调用本机clearTimeout而不是重写的clearTimeout。有什么解决方法?

最佳答案

在IE中,最初,setTimeout属性存在于
  窗口,而不是窗口本身。因此,当您要求window.setTimeout时,
  它实际上遍历了原型链上的一个步骤来解决
  参考。同样,当您请求setTimeout时,它会向下遍历
  范围链,然后到窗口,然后向下到原型链,
  解决参考。
  
  我怀疑IE具有自动优化的内置优化功能
  缓存所有被发现的隐式全局变量的分辨率
  下降到全局对象的原型。那就好
  这样做的理由,因为这些是通常要求的参考,并且
  遍历该链条成本很高。但是,必须对此进行设置
  引用为只读,因为它只是缓存优化。这个
  具有导致引发异常的不幸的副作用
  尝试通过将其用作左值分配给参考时。


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

关于javascript - 为什么IE8上的黑白window.clearTimeout和clearTimeout有区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13177868/

10-12 00:01