JavaScript:当作用域已经允许访问时,为什么checkLeaf需要参数?

JavaScript:当作用域已经允许访问时,为什么checkLeaf需要参数?,javascript,recursion,scope,parameter-passing,binary-tree,Javascript,Recursion,Scope,Parameter Passing,Binary Tree,我们的讲师编写了这个递归搜索JavaScript对象的函数 我的问题涉及传递到外部isContained函数的leaf和value参数的范围:根据我对变量范围的理解,内部checkLeaf函数已经可以访问传递到外部函数的变量。在观察checkLeaf函数中访问的leaf和value变量时,这是不言而喻的 那么为什么需要将leaf传递到checkLeaf?此外,如果要传递参数,那么为什么只传递leaf而不传递value,因为这两个参数显然都是从内部函数中访问的 const isContained

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

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

那么为什么需要将
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);

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

因为leaf发生了变化,所以它并不总是传递给外部函数的值。好的,这与递归有关吗?运行它并调试它。使用铅笔和纸玩电脑。正确-您搜索的值不会改变,因此不需要传递原始随附的值。它可能是,如果
checkLeaf
函数自己做了,它就必须是(就像你想单独测试它一样)。@Sean——是的,这对其他人非常有用。但是,这个问题在堆栈溢出时已经处理过多次。我不知道另一个解释实例会改善归档。如果没有格式化,“变量值保持不变”可能会被误解为“变量的值<代码>叶”。