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



我目前正在学习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

我预计testArrAfter Before的变化不会完全相同,因为据我所知,函数参数不是全局的。

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

如果有人能向我解释为什么testArr在函数中纵以及我如何改变这一点,我将不胜感激。

在 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 是一个全局变量,但正如你所看到的,它被函数 changeAgePure 改变了。

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

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 变量不会被函数更改,因为我们已经创建了一个中间变量。

相关内容

  • 没有找到相关文章

最新更新