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

时间:2011-12-23 23:08:02

标签: 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似乎是唯一不对它自身真实的例外,所以递归继续如下:

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

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

我尝试使用IE Developer工具进行谷歌搜索和调试,我只能收集到的是DispHTMLWindow2类型的对象(这对我来说意义不大)和那个(与其他不同)浏览器)既不是对象也不是数组。

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

如果有人能够了解IE中window.frames的行为与其他任何javascript对象(导致此类无限递归)不同的原因,那将非常感激。

提前致谢。

1 个答案:

答案 0 :(得分:4)

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

  

如果有人能够了解IE中的window.frames与其他任何javascript对象(导致这种类型的无限递归)不同的原因,那将非常感激。

window.frames是一个宿主对象。允许主机对象在ES3中做任何他们喜欢的事情。 IE因出现严重行为不当的主机对象而臭名昭着。你无能为力。

我建议你做脏兮兮的黑客,这是一个硬编码检查密钥是'frames'而obj是window而忽略了整个事情。

window.frames内还有另一堆属性也不行。