通過引用或值傳遞引數

在 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