javascript - IE 递归中的堆栈溢出 -> window.frames 不等于自身

标签 javascript internet-explorer recursion stack-overflow

我正在对窗口全局范围内可用的整​​个 JavaScript 对象树进行递归。

在 Chrome、Firefox 和 Safari 中一切正常,但我在 Internet Explorer 中遇到了一些问题。

基本上,当我遍历树时,我正在构建一堆对象,因此我可以检查对象的行是否已分配到多个位置。例如我检查。

var ignoreStack = [window, document]; // grows over time to contain every object

ignoreStack.contains = function(obj) {
  for(var i=0;i<this.length;i++) {
    if (this[i] === obj) {return true;} 
  }
  return false;
};

// ... further down the line inside a recursion
if (!(obj instanceof Object)) {return;}
for (var prop in obj) { 
  if (ignoreStack.contains(obj[prop])) {return;}
  ignoreStack.push(obj[prop]);
  recurse(obj[prop], prop);
}

现在唯一的问题是当它检查以下内容时:

// Returns true in Chrome, Safari and Firefox
console.log(window.frames.frames === window.frames);
// Return false in IE

树中的每个其他对象都等于其自身,但是 IE 中的 window.frames 似乎是唯一的异常(exception),它与自身不相符,因此递归继续如下:

// window.frames.frames.frames.frames.frames ...etc

有人知道为什么window.frames不等于它自己吗?

我尝试在 google 中进行一些挖掘并使用 IE Developer 工具进行调试,我所能收集到的只是它是一个 DispHTMLWindow2 类型的对象(这对我来说意义不大)并且(与其他浏览器不同)它既不是对象也不是数组。

// Returns true in Chrome, Safari and Firefox
console.log(window.frames instanceof Object);
// Return false in IE

如果有人能够解释为什么 IE 中的 window.frames 的行为不同于任何其他 javascript 对象(导致这种类型的无限递归),我们将不胜感激。

提前致谢。

最佳答案

Related question about other host objects that are not equal in IE

If somebody could shed some light on the reason why window.frames in IE behaves unlike any other javascript object (causing this type of infinite recursion) that would be much appreciated.

window.frames 是一个宿主对象。在 ES3 中,宿主对象可以为所欲为。 IE 因其宿主对象行为异常而臭名昭著。您对此无能为力。

我建议您进行肮脏的黑客攻击,这是一种硬编码检查键是否为'frames'并且对象是否为window并忽略整个事情。

window.frames 内还有另外一堆属性也不起作用。

关于javascript - IE 递归中的堆栈溢出 -> window.frames 不等于自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8621418/

相关文章:

javascript - jquery函数不支持

jquery - 提交删除IE中的输入文件值

c++ - 计算 double 组中所有元素的总和

java - 如何计算二叉搜索树的深度

javascript - 在多维数组中查找值的最快方法?

javascript - 将基于 JIT 的 lang 编译为 Webassembly

javascript - 使用 node.js 重命名文件

JavaScript regex exec 执行时间太长

internet-explorer - 开发工具问题 (IE 11) - "Error: Object doesn' t 支持属性或方法 'addEventListener'"

r - 如何定义一系列递归函数?