2013-02-26 38 views
1

为了学习的目的,我在javascript中遍历对象。现在,相当于吐出第一个对象中的每个属性,该函数被赋予并递归到它找到的任何子对象(包括函数)中。递归到没有无限循环的对象中

以窗口对象为例,当window.top指向窗口时,函数陷入无限循环。我应该如何最好地追踪我已经遍历的对象,以避免递归到它们中?

+1

在JS中,您可以将属性添加到任何对象,甚至是本地对象。所以你可以说'currentObj.didProcess = true'。 'currentObj'可能是'window','HTMLElement'或者函数。 – marekful 2013-02-26 11:57:15

+0

我喜欢这个想法。 – 2013-02-26 11:58:02

+0

尽管存在冲突的可能性很小,因为其他代码可能正在创建具有相同名称的属性。您还必须确保在代码执行后您创建的属性被删除,其中包括处理可能的错误。我会考虑修改这样的对象,因为它可能会影响其他代码。 – 2013-02-26 17:59:58

回答

1

您可以使用数组来存储您当前正在查看的对象。这应该有助于检测循环引用:

var stack = []; 
function traverse(object) { 
    if (stack.indexOf(object) !== -1) { 
    return; // if the condition above is true, we have a circular reference 
    } 
    stack.push(object); 
    // here go through object properties, recursively calling traverse() 
    stack.pop(); 
} 
+0

我会试试这个,看看我们是否错过了一些东西。这是我的想法之一,但我认为我驳回了它,因为我看不到如何比较对象。将接受这个如果它的工作! – 2013-02-27 12:10:56