IE 中的 javascript 递归 -> window.frame 不等于自身



我正在做一个递归,通过整个树的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开发工具,我所能收集的是,它的类型为DispHTMLWindow2的对象(不是说,这意味着很多对我来说)和(不像在其他浏览器)它既不是一个对象也不是一个数组。

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

如果有人能说明为什么window.frames在IE中的行为不像任何其他javascript对象(导致这种类型的无限递归),那将是非常感激的。

其他主机对象在IE中不相等的相关问题

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

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

我建议你做肮脏的hack,这是一个硬编码检查是否密钥是'frames'和对象是window,忽略整个事情。

window.frames中还有另外一堆属性也没有表现。

最新更新