#定義
在《JavaScript高級程序設計》第三版4.1.3,講到傳遞參數:
ECMAScript中所有函數的參數都是按值傳遞的。
什麼是按值傳遞呢?
也就是說,把函數外部的值複製給函數內部的參數,就和把值從一個變量複製到另一個變量一樣。
#按值傳遞
在像參數傳遞基本類型的值時,被傳遞的值會被複制給一個局部變量(即命名參數)
var value = 1;
function foo(v) {
v = 2;
console.log(v); //2
}
foo(value);
console.log(value) // 1
很好理解,當傳遞value到函數foo中,相當於拷貝了一份value,假設拷貝的這份叫_value,函數中修改的都是_value的值,而不會影響原來的value值。
引用傳遞
在像參數傳遞引用類型的值時,會把這個值得內存中的地址複製給一個局部變量,因此這個局部變量的變化會反映在函數的外部。
(即按引用傳遞,就是傳遞對象的引用,函數內部對參數的任何改變都會影響該對象的值,因爲兩者引用的是同一個對象。)
var obj = {
value: 1
};
function foo(o) {
o.value = 2;
console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2
看,這就是引用傳遞,o的變化反映到了obj這個對象上
#共享傳遞
我的理解是,參數是對象的值,也是把這個值的內存中的地址複製給一個局部變量。如果把這個局部變量重新賦值一個對象,就相當於改變了指向並獨立,與原來的對象不會再存在關係了,所以這個改變不會反應到函數外部。
var obj = {
value: 1
};
function foo(o) {
o = 2;
console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1
var obj = {
value: 1
};
function foo(o) {
o = {
value:3
};
}
foo(obj);
console.log(obj.value) // 1
看,這就是共享傳遞,改變引用參數的值不會影響到外部。
#傳值還是傳引用或共享
function changeStuff(num, obj1, obj2)
{
num = num * 10;
obj1.item = "changed";
obj2 = {item: "changed"};
}
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num); // 10
console.log(obj1.item); // changed
console.log(obj2.item); // unchanged