在另一个函数内返回一个函数的结果会产生不正确

时间:2015-05-16 02:01:11

标签: javascript arrays function

我有两个功能。一个是不纯的函数,只返回另一个的结果。我对两种不同方式之间的结果差异感到困惑。

功能:

function reverseArray(array) {
  var newArray = [];
  for(i = 0; i < array.length; i++) {
    newArray.unshift(array[i]);
  }
  return newArray;
}

function reverseArrayInPlace(array) {
  return reverseArray(array);
}

我打电话的时候:

console.log(reverseArrayInPlace(["one", "two"]));

控制台显示我的期望,即:["two", "one"]

但是当我将数组分配给变量时,将其作为arg传递,然后登录到控制台,如下所示:

var foo = ["one", "two"];
reverseArrayInPlace(foo);
console.log(foo);

我得到["one", "two"]

为什么后一种情况产生的结果与前者不同?

4 个答案:

答案 0 :(得分:1)

因为您的代码是“按值调用”。

当使用显式参数foo调用reverseArrayInPlace时,会为函数体生成一个foo的副本。该功能不会改变原来的foo。

为了将foo设置为函数的返回值,可以编写

x = open('C:/Users/Acer/Desktop/test3.txt', 'w')
for i in longlist:
    x.write("%s, " % i)
x.close()

答案 1 :(得分:1)

就像你没有改变程序中的状态而只是返回一个值一样简单。因此,如果你想影响foo的变化,你必须将它设置为等于reverseArrayInPlace的结果

固定:

var foo = ["one", "two"];
foo = reverseArrayInPlace(foo);
console.log(foo);

答案 2 :(得分:1)

newArray.unshift(array[i]) prepends将元素传递到数组的前面。请注意,元素列表作为整体预先添加,以便前置元素保持相同的顺序。所有数值数组键都将被修改为从零开始计数,而文字键不会被触及。

看一下这个例子:

<?php
$queue = array("orange", "banana");
array_unshift($queue, "apple", "raspberry");
print_r($queue);
?>

以上示例将输出:

Array
(
    [0] => apple
    [1] => raspberry
    [2] => orange
    [3] => banana
)

请注意,如果传递数组["something","another"],则取消移位["another","something"],但不返回变量。

答案 3 :(得分:0)

第一个代码打印函数的结果,第二个代码打印函数的参数

要查看该行为是否相同:

var foo = ["one", "two"];
console.log(reverseArrayInPlace(foo));

附注:

  • 函数reverseArray / reverseArrayInPlace都是纯函数(不更改值/状态,并为同一输入返回相同的结果)
  • 基于函数名称,您希望foo看起来更改 - 为了实现这一点,您需要修改作为参数传入的数组,而不是创建新数组。

代码显示了一种更改数组的方法:

function reverseArrayInPlace(array) {
  var reversed = reverseArray(array);
  for(var i = 0; i < array.length; i++)
  {
     array[i] = reversed[i];
  }
}

var foo = ["one", "two"];
reverseArrayInPlace(foo);
console.log(foo); // ["two", "one"]
相关问题