我正在对窗口全局范围内可用的整个 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/