这是一个遍历整个文档对象模型的简单函数。我想要了解这是广度优先还是深度优先以及如何理解原因:
var traverseDOM = function () {
function traverse (parent) {
// mark 1
_(parent.childNodes).forEach((child) => {
traverse(child);
}
// mark 2
}
traverse(document.body);
}
这似乎是深度优先搜索此相关的SO Post。
可以根据wikipedia对其进行进一步分类。
InOrder,PreOrder和PostOrder。
答案 0 :(得分:3)
考虑以下树:
您从traverse(1)
开始:
traverse(1)
在“标记1”之后,该方法将开始循环遍历所有子节点,为每个子节点调用traverse
。第一个,traverse(1.1)
,将“插入执行”:
traverse(1)
traverse(1.1)
当traverse(1.1)
点击“标记1”时,它将开始其子项并致电traverse(1.1.1)
:
traverse(1)
traverse(1.1)
traverse(1.1.1)
由于“1.1.1”没有任何子节点,traverse(1.1.1)
到达“标记2”,执行流将返回到父方法forEach
的{{1}}循环:< / p>
traverse(1.1)
循环继续,并且将为第二个孩子“1.1.2”调用traverse(1)
traverse(1.1)
:
traverse
处理完两个“1.1”的子项后,traverse(1)
traverse(1.1)
traverse(1.1.2)
达到“标记2”,执行流程现在回到traverse(1.1)
的{{1}}循环中:
forEach
继续“1.2”:
traverse(1)
我会在这里停下来,但你应该掌握它。您可以看到“1.1.1”和“1.1.2”在“1.2”之前被访问,使其成为深度优先搜索。广度优先搜索将在“1.1.1”之前访问“1.2”和“1.3”。
答案 1 :(得分:1)
正如尤金所说,它是深度优先搜索算法的一个例子。如果你在第4行注意到它正在使用递归并传递它搜索过的第一个孩子:
`traverse(child);`
并且此行在父节点中被称为for each child
。
更新:为了清晰起见,添加评论: “一旦它获得”第一个“子节点,它就会再次调用该子节点上的遍历函数,强制系统向下移动直到它到达节点。”