0%

JavaScript 核心 (25) - 物件 - Call by Reference 還是 Call by Sharing

傳參照呼叫 Call by reference

傳參照呼叫
傳遞給函式的是它的實際參數的隱式參照而不是實參的拷貝。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function fn (a) {
var temp = 100;
a.x = temp;
a['y'] = a.x;
}

var obj = {
x: 10,
y: 20,
}

fn(obj);

console.log(obj.x, obj.y); /* 100, 100 */

傳共享物件呼叫 Call by sharing

傳共享物件呼叫
對於呼叫者而言在被呼叫函數裡修改參數是沒有影響的。如果要達成傳參照呼叫的效果就需要傳一個共享物件,一旦被呼叫者修改了物件,呼叫者就可以看到變化(因為物件是共享的,沒有拷貝)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function fn (a) {
a = {
b: 100,
c: 50
}
}

var obj = {
x: 10,
y: 20,
}

fn(obj);

console.log(obj); /* { x: 10, y: 20, } */

由此可知兩點:

  • 對傳入的參數進行點運算、中括號賦值等操作會是 Call by reference
  • 對傳入的參數進行物件實字宣告賦值等操作會是 Call by sharing

參考資料

六角學院 - JavaScript 核心篇
JavaScript 核心觀念(29)-物件-Call by Reference 還是 Call by Sharing