通过引用或值传递参数

在 JavaScript 中,所有参数都按值传递。当函数为参数变量分配新值时,调用者将无法看到该更改:

var obj = {a: 2};
function myfunc(arg){
    arg = {a: 5}; // Note the assignment is to the parameter variable itself
}
myfunc(obj);
console.log(obj.a); // 2

然而,为了(嵌套的)特性的变更这种参数,将是给呼叫者可见:

var obj = {a: 2};
function myfunc(arg){
    arg.a = 5; // assignment to a property of the argument
}
myfunc(obj);
console.log(obj.a); // 5

这可以看作是一个引用调用 :尽管函数不能通过为其赋值新来改变调用者的对象,但它可能会改变调用者的对象。

由于原始值的参数(如数字或字符串)是不可变的,因此函数无法改变它们:

var s = 'say';
function myfunc(arg){
    arg += ' hello'; // assignment to the parameter variable itself
}
myfunc(s);
console.log(s); // 'say'

当函数想要改变作为参数传递的对象,但不想实际改变调用者的对象时,应该重新赋值参数变量:

Version >= 6

var obj = {a: 2, b: 3};
function myfunc(arg){
    arg = Object.assign({}, arg); // assignment to argument variable, shallow copy
    arg.a = 5;
}
myfunc(obj);
console.log(obj.a); // 2

作为参数的就地变异的替代方法,函数可以基于参数创建新值,并返回它。然后调用者可以将它分配给它,即使是作为参数传递的原始变量:

var a = 2;
function myfunc(arg){
    arg++;
    return arg;
}
a = myfunc(a);
console.log(obj.a); // 3