JavaScript作用域(递归)——参数值被返回值覆盖,没有显式声明

JavaScript作用域(递归)——参数值被返回值覆盖,没有显式声明,javascript,algorithm,recursion,Javascript,Algorithm,Recursion,我对顺序树遍历的第一个解决方案利用了递归函数调用的返回值: BST.prototype.inOrder = function(node, array){ if(!node){ return []; } if(!array){ array = []; } return this.inOrder(node.left).concat([node.val], this.inOrder(node.right)) } 但后来我发现它也可以用下面的代码解决,我对“array”值是如何持

我对顺序树遍历的第一个解决方案利用了递归函数调用的返回值:

BST.prototype.inOrder = function(node, array){
   if(!node){ return []; }
   if(!array){ array = []; }

   return this.inOrder(node.left).concat([node.val], this.inOrder(node.right))

}
但后来我发现它也可以用下面的代码解决,我对“array”值是如何持久化的感到困惑

BST.prototype.inOrder = function(node, array){
  if(!node){ return []; }
  if(!array){ array = []; }
  this.inOrder(node.left, array);
  array.push(node.val);
  this.inOrder(node.right, array)
  return array
}

当第一个递归函数调用返回时,它是否覆盖该函数范围内的数组值?为什么要这样做?

这是一个重载函数,在第一次调用中不需要第二个参数就可以调用,在这种情况下,变量是用空数组初始化的。写这篇文章的更好方法可能是

BST.prototype.appendInOrder = function(node, array) {
  if (!node) return;
  this.appendInOrder(node.left, array);
  array.push(node.val);
  this.appendInOrder(node.right, array);
}
BST.prototype.inOrder = function(node) {
  var array = [];
  this.appendInOrder(node, array);
  return array;
}

这是一个重载函数,在第一次调用中无需第二个参数即可调用,在这种情况下,变量将使用空数组初始化。写这篇文章的更好方法可能是

BST.prototype.appendInOrder = function(node, array) {
  if (!node) return;
  this.appendInOrder(node.left, array);
  array.push(node.val);
  this.appendInOrder(node.right, array);
}
BST.prototype.inOrder = function(node) {
  var array = [];
  this.appendInOrder(node, array);
  return array;
}

数组不会被“覆盖”,它会递归地变异,直到没有更多的数据。因此,您的意思是,在数组上执行的更深一层的操作也会在初始调用的范围内对数组执行?是的,递归调用中会传递对它的引用。JavaScript(和许多其他语言)中的数组是引用类型,当您将它们作为参数传递给函数时,它们不会被复制。你对作用域的关注在这里是错误的。数组不是“覆盖”的,它是递归变异的,直到没有更多的数据。所以你是说在数组上执行更深一层的操作也会在初始调用的作用域中的数组上执行?是的,递归调用中会传递对它的引用。JavaScript(和许多其他语言)中的数组是引用类型,当您将它们作为参数传递给函数时,它们不会被复制。你对作用域的关注是错误的。嗯,所以本质上你是在传递参数数组,以便其他作用域可以访问内存中的相同数组?是的,没错,所有对象(包括数组)都是引用值。将值传递给函数将共享对内存中可变属性集合的引用。嗯,因此本质上,您传递的是参数数组,以便这些其他作用域可以访问内存中的同一数组?是的,确切地说,所有对象(包括数组)都是引用值。将值传递给函数将共享对内存中可变属性集合的引用。