我无法理解的函数语法差异

Difference in syntax of a function that I cannot understand

我正在为广度优先搜索算法编写一个函数。我会想出以下代码

traverseBF() {
        const results = []
        const queue = [this.root]
        while (queue.length) {
            let node = queue.shift()
            if (node.children) {
                queue.push(...node.children)
            }
            results.push(node)
        }
        return results
    }

但是,解决方案的写法有些不同

traverseBF(fn) {
        const queue = [this.root]
        while (queue.length) {
            let node = queue.shift()
            if (node.children) {
                queue.push(...node.children)
            }
            fn(node)
        }
    }

我无法解释 fn(node) 目的是什么,也无法解释 returns 正确的结果。这是某种递归调用吗?这两种解决方案有何不同?

它们不像您那样返回结果,而是允许用户传入一个函数,该函数会在遍历每个节点时传递给它。

举个例子:

obj.traverseBF(node => console.log(node))

或者只是

obj.traverseBF(console.log)

应该也可以。 console.log 给每个节点以在找到时使用。

这可以说是更通用的目的。如果树很大,如果用户不需要同时需要所有结果,则将所有结果累积在一个列表中可能会浪费内存。

如果用户想要累积一个列表,他们可以传入一个附加到函数关闭的列表的函数:

nodes = [];
obj.traverseBF(node => nodes.push(node))

console.log(nodes)