【问题标题】:JavaScript: Why does checkLeaf need parameter when scope already allows access?JavaScript:当范围已经允许访问时,为什么 checkLeaf 需要参数?
【发布时间】:2018-03-24 01:13:53
【问题描述】:

我们的讲师编写了这个递归搜索 JavaScript 对象的函数。

我的问题涉及传递给外部isContained 函数的leafvalue 参数的范围:根据我对变量范围的理解,内部checkLeaf 函数已经可以访问传递给外功能。在观察leafvalue 变量在checkLeaf 函数内被访问时,这是不言而喻的。

那么为什么需要将leaf 传递给checkLeaf?此外,如果要传递参数,那么为什么只有leaf 而不是value,因为显然两者都是从内部函数内部访问的?

const isContained = function(leaf, value) {
  function checkLeaf(leaf) {

    if (leaf.value === value) {
      return true;
    }
    if (leaf.left && leaf.value > value) {
      return checkLeaf(leaf.left);
    }
    if (leaf.right) return checkLeaf(leaf.right);
    return checkLeaf(leaf);
  }
}

isContained(binarySearchTree, 6);

【问题讨论】:

  • 因为叶子改变了——它并不总是传递给外部函数的值。
  • 好的,所以这与递归有关?
  • 运行它-调试它。用铅笔和纸玩电脑。
  • 正确-您要搜索的值不会改变,因此不需要传递原始包含的值。它可能是,如果checkLeaf 函数自己执行,它就需要是(例如,如果您希望能够单独测试它)。
  • @Sean -- 是的,这对其他人非常有用。但是,该问题已在 Stack Overflow 上处理过多次。我不知道另一个解释实例会改善档案。

标签: javascript recursion scope parameter-passing binary-tree


【解决方案1】:

leaf 是传递给内部函数 checkLeaf 的唯一变量,因为它是唯一会在 checkLeaf 遍历其递归调用堆栈时更改的变量。变量value 保持不变,因为它是正在搜索的内容,因此不需要也将其传递给checkLeaf 函数。

【讨论】:

  • 如果没有格式化,“变量值保持不变”可能会被误解为“变量的值leaf”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多