Javascript 为什么IE8上的Windows.clearTimeout和clearTimeout有区别?
我试图覆盖clearTimeout函数,该函数在除IE8之外的所有浏览器中都能正常工作Javascript 为什么IE8上的Windows.clearTimeout和clearTimeout有区别?,javascript,internet-explorer,overriding,Javascript,Internet Explorer,Overriding,我试图覆盖clearTimeout函数,该函数在除IE8之外的所有浏览器中都能正常工作 clearTimeout = function(){}; IE8给出了以下错误: Object doesn't support this action 但当我这么做的时候 window.clearTimeout = function(){}; 它在覆盖clearTimeout时工作得非常好。为什么会有这种行为 此外,在我的代码中的任何地方,我都直接调用clearTimeout,而不是作为window.c
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有一个内置的优化,它可以自动
缓存所有已发现的隐含全局变量的解析
在全局对象的原型上。那会很好的
这样做的原因,因为这些是通常要求的参考资料,以及
穿越这条链条代价高昂。但是,它必须设置此选项
引用为只读,因为它只是缓存优化。这
具有导致抛出异常的不幸副作用
尝试将引用用作左值来分配给引用时
来源:为什么要覆盖默认行为?我正在编写QUnit测试用例,在其中我试图跟踪是否使用特定参数调用了clearTimeout。窗口对象是主机对象,clearTimeout是主机方法。他们不必遵守ECMA-262,几乎可以做他们喜欢做的事情。你不能在自己的函数中包装set/clearinterval/Timeout吗?@DanielA.White这是我的问题吗?因为我想这就是我要做的,如果我没有错或者有其他的包装方式吗?我在IE8中快速尝试设置window.constructor.prototype.setTimeout,但这似乎没有任何作用-可能是因为window是DispHTMLWindow2类型的本机对象。