2013-02-26 94 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