Да, эта функция обхода дерева имеет смысл, поскольку:
- аргумент функции должен знать, как обрабатывать (любые) узлы
- предполагается, что первый аргумент вызова является поддерживаемым узлом (например, не document.body, если func не знает, как с ним работать)
Тем не менее, этот алгоритм все еще выглядит некорректно для меня, поскольку он исследует только через первого родного брата; другие братья и сестры будут просто игнорироваться. Поэтому я бы рекомендовал вместо этого использовать более традиционный подход:
function walk(node, func) {
var children = node.childNodes;
for (var i = 0; i < children.length; i++) // Children are siblings to each other
walk(children[i], func);
func(node);
}
Обратите внимание, что версия "сначала глубоко" (то есть не вызывает call func () перед обработкой потомков), но я бы лучше порекомендовал ее, поскольку func, вероятно, изменит узлы. Таким образом, обработка родителя сможет учитывать последнее состояние его уже обработанных потомков, прежде чем вводить, возможно, неподходящие изменения.