副作用/传递到函数中的全局变容变化

Side effect/ changing global varaibles that pass into a function

本文关键字:全局 变化 函数 副作用      更新时间:2023-09-26

如果有人问我这个问题,请原谅,但我似乎找不到。

我正在尝试创建一个数组并反转它(不使用reverse)这段代码非常完美:

function reverseArrayInPlace(array) {
  for (var i = 0; i < Math.floor(array.length / 2); i++) {
    var old = array[i];
    array[i] = array[array.length - 1 - i];
    array[array.length - 1 - i] = old;
  }
  return array;
}

var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]

正如您所看到的,它在array中接受一个,执行一些逻辑,并返回相同的更改后的array

尽管如此,对我来说,为什么这个代码不起作用是没有意义的:

var some_array = [6,7,8,9,10];
function reverseArrayInPlace(array) {
    var replacement_array = [];
    for (var i = 0; i < some_array.length; i++)
        replacement_array.unshift(array[i])
    array = replacement_array;
    return array;
}
reverseArrayInPlace(some_array);
console.log(some_array);
// → [ 6, 7, 8, 9, 10 ]

此代码还接收一个数组,执行一些逻辑(和赋值)并返回一个数组。为什么它不像第一个那样改变全局变量?有什么方法可以改变它吗?

好的,你需要这个:

function reverseArrayInPlace(array) {
   replacement_array = [];
   for (var i = 0; i <array.length; i++)
   { 
       replacement_array.unshift(array[i])
   }
   for(var i = 0; i <array.length; i++){
       array[i]=replacement_array[i]
   }
   return array;
}
some_array = [6,7,8,9,10];
reverseArrayInPlace(some_array)
console.log(some_array)

替换变量的内容将起作用。

逐步通过代码:

function reverseArrayInPlace(array) {
    var replacement_array = [];
    for (var i = 0; i < some_array.length; i++)
        replacement_array.unshift(array[i])

此时,您已经创建了一个与原始数组相反的新数组。

    array = replacement_array;

array分配新值不会改变原始数组;只有可变数组方法或元素取消引用才能实现这一点。

    return array;
}

您在这里返回新数组,这样您就可以在函数之外执行赋值:

some_array = reverseArrayInPlace(some_array);
console.log(some_array);

然而,这不再符合修改现有阵列的条件;您可以使用unshift()splice(),不过:

for (var i = 1, n = array.length; i < n; ++i) {
    array.unshift(array.splice(i, 1)[0]);
}

直接影响全局:

    var some_array = [6,7,8,9,10];
    
    function reverseArrayInPlace(array) {
        var replacement_array = [];
        for (var i = 0; i < array.length; i++)
            replacement_array.unshift(array[i]);
        for (var i = 0; i < array.length; i++)
            array[i] = replacement_array[i];
    }
     
    reverseArrayInPlace(some_array);
    alert(some_array);

您不需要返回数组。