javascript - 我无法理解的函数语法差异
问题描述
我正在为广度优先搜索算法编写一个函数。我会想出以下代码
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)
目的是什么或它如何返回正确的结果。这是某种递归调用吗?这两种解决方案有何不同?
解决方案
他们不是像你一样返回结果,而是允许用户传入一个函数,该函数在遍历每个节点时传递给它。
尝试例如:
obj.traverseBF(node => console.log(node))
要不就
obj.traverseBF(console.log)
也应该工作。console.log
给每个节点以在找到时使用。
这可以说是更通用的目的。如果树很大,如果用户不需要一次所有结果,将所有结果累积到一个列表中可能会浪费内存。
如果用户想要累积一个列表,他们可以传入一个附加到该函数关闭的列表的函数:
nodes = [];
obj.traverseBF(node => nodes.push(node))
console.log(nodes)
推荐阅读
- sql - SQL Server:快速而肮脏的数据验证查询?
- ios - 如何在带有 iOS 的 Google Analytics(分析)中设置自定义变量标签
- java - 安装应用程序后立即发送 FCM 注册
- c++ - 不确定如何修复“会员参考”错误
- selenium-webdriver - 如何使用 Python 获取 WebDriver 以删除汇合页面表中的现有值?
- ruby - 设置 Capybara 值的竞态条件
- python - NameError:全局名称“interfaceName”未定义,即使它是
- postgresql - Airflow PostgresHook 从未提交的插入语句返回 ID
- c++ - 查询 SDL_Surface 以获取像素颜色的效率
- android - Android Image View 不是从顶部开始的