Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么IE8上的Windows.clearTimeout和clearTimeout有区别?_Javascript_Internet Explorer_Overriding - Fatal编程技术网

Javascript 为什么IE8上的Windows.clearTimeout和clearTimeout有区别?

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函数,该函数在除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有一个内置的优化,它可以自动 缓存所有已发现的隐含全局变量的解析 在全局对象的原型上。那会很好的 这样做的原因,因为这些是通常要求的参考资料,以及 穿越这条链条代价高昂。但是,它必须设置此选项 引用为只读,因为它只是缓存优化。这 具有导致抛出异常的不幸副作用 尝试将引用用作左值来分配给引用时


来源:

为什么要覆盖默认行为?我正在编写QUnit测试用例,在其中我试图跟踪是否使用特定参数调用了clearTimeout。窗口对象是主机对象,clearTimeout是主机方法。他们不必遵守ECMA-262,几乎可以做他们喜欢做的事情。你不能在自己的函数中包装set/clearinterval/Timeout吗?@DanielA.White这是我的问题吗?因为我想这就是我要做的,如果我没有错或者有其他的包装方式吗?我在IE8中快速尝试设置window.constructor.prototype.setTimeout,但这似乎没有任何作用-可能是因为window是DispHTMLWindow2类型的本机对象。