2013-02-26 4 views
1

Я просматриваю объекты в javascript с целью обучения. Прямо сейчас, что сводится к выплескиванию каждого свойства в первом объекте, функция дается и рекурсирует на любые дочерние объекты, которые он находит (включая функции).Рекурсия в объекты без бесконечного цикла

Использование оконного объекта в качестве примера, функция застревает в бесконечном цикле, поскольку window.top указывает на окно. Как лучше всего отслеживать, какие объекты я уже прошел, чтобы избежать их повторения?

+1

В JS вы можете добавлять свойства к любому объекту, даже к родным. Таким образом, вы можете сказать 'currentObj.didProcess = true'. 'currentObj' может быть' window', экземпляром 'HTMLElement' или функцией. – marekful

+0

Мне нравится эта идея. –

+0

Существует небольшая вероятность конфликта, потому что какой-то другой код может создавать свойства с тем же именем. Вы также должны убедиться, что создаваемые вами свойства будут удалены после выполнения кода, который включает обработку возможных ошибок. Я бы подумал об изменении таких объектов как плохой практики в целом, поскольку это потенциально влияет на другой код. –

ответ

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

Я собираюсь попробовать это и посмотреть, не пропустили ли мы что-то. Это была одна из моих мыслей, но я думаю, что я отклонил ее, потому что не мог видеть, как сравнивать объекты. Примите это, если он сработает! –

Смежные вопросы