将全局变量作为函数中的参数进行操作

时间:2019-07-19 11:28:33

标签: javascript arrays global-variables

我目前正在学习JavaScript,并对以下代码有疑问。

var testArr = [1, 2, 3, 4, 5];

function nextInLine(arr, item) {
  arr.push(item);
  arr.shift();
}

console.log("Before: " + testArr);
nextInLine(testArr, 6);
console.log(" After: " + testArr);

输出为:

之前:1,2,3,4,5

之后:2,3,4,5,6

我希望testArrBeforeAfter的变化不会完全相同,因为据我所知,函数参数不是全局的。

但是该函数实际上操作了全局变量testArr,即使它从未在函数中被提及,而只是作为参数输入。

如果有人能向我解释为什么testArr会在函数中被操纵以及如何更改它,我将非常感激。

1 个答案:

答案 0 :(得分:1)

在JS中,没有像其他编程语言(如C ++)那样按值或按引用传递变量的事情。 处理此类问题的方法是创建要临时修改的对象的副本。您可以在下面看到区别

function changeAgeImpure(person) {
    person.age = 25;
    return person;
}
var alex = {
    name: 'Alex',
    age: 30
};
var changedAlex = changeAgeImpure(alex);
console.log(alex); // -> { name: 'Alex', age: 25 }
console.log(changedAlex); // -> { name: 'Alex', age: 25 }

alex是一个全局变量,但是正如您所看到的那样,它已由changeAgeImpure函数更改。

解决此类问题的方式(至少在我的示例中)是这种方式:

function changeAgePure(person) {
    var newPersonObj = JSON.parse(JSON.stringify(person));
    newPersonObj.age = 25;
    return newPersonObj;
}
var alex = {
    name: 'Alex',
    age: 30
};
var alexChanged = changeAgePure(alex);
console.log(alex); // -> { name: 'Alex', age: 30 }
console.log(alexChanged); // -> { name: 'Alex', age: 25 }

现在,由于我们已经创建了一个中间变量,因此函数不会更改alex变量。