1
爲了學習的目的,我在javascript中遍歷對象。現在,相當於吐出第一個對象中的每個屬性,該函數被賦予並遞歸到它找到的任何子對象(包括函數)中。遞歸到沒有無限循環的對象中
以窗口對象爲例,當window.top指向窗口時,函數陷入無限循環。我應該如何最好地追蹤我已經遍歷的對象,以避免遞歸到它們中?
爲了學習的目的,我在javascript中遍歷對象。現在,相當於吐出第一個對象中的每個屬性,該函數被賦予並遞歸到它找到的任何子對象(包括函數)中。遞歸到沒有無限循環的對象中
以窗口對象爲例,當window.top指向窗口時,函數陷入無限循環。我應該如何最好地追蹤我已經遍歷的對象,以避免遞歸到它們中?
您可以使用數組來存儲您當前正在查看的對象。這應該有助於檢測循環引用:
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();
}
我會試試這個,看看我們是否錯過了一些東西。這是我的想法之一,但我認爲我駁回了它,因爲我看不到如何比較對象。將接受這個如果它的工作! – 2013-02-27 12:10:56
在JS中,您可以將屬性添加到任何對象,甚至是本地對象。所以你可以說'currentObj.didProcess = true'。 'currentObj'可能是'window','HTMLElement'或者函數。 – marekful 2013-02-26 11:57:15
我喜歡這個想法。 – 2013-02-26 11:58:02
儘管存在衝突的可能性很小,因爲其他代碼可能正在創建具有相同名稱的屬性。您還必須確保在代碼執行後您創建的屬性被刪除,其中包括處理可能的錯誤。我會考慮修改這樣的對象,因爲它可能會影響其他代碼。 – 2013-02-26 17:59:58