通过引用或值传递参数
在 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