js中所有的函數都是按值傳遞的。
在向參數傳遞基本類型時,被傳遞的值會被復制給一個局部變量。
在向參數傳遞引用類型的值時,會把這個值在內存中的地址復制給一個局部變量,因此這個局部變量的變化會反映在函數的外部。
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20,沒有變化
alert(result); //30
count傳遞給參數num,函數內部num做了修改,但是沒有反映到count上。
function setName(obj){
obj.name = "Jack";
}
var person = new Object();
setName(person);
alert(person.name); //Jack
這個例子很容易讓人覺得,引用類型做為函數參數傳遞是按引用傳遞的,因為局部的修改:obj.name = "Jack",反映在了全局的作用域上:person.name,事實上并不是如此。
事實上:我們創建了一個對象,并把它保存在person變量中,然后把person當做參數傳遞到setName()函數中復制給了obj,在這個函數內部obj和person引用的是同一個對象。
再看一個例子:
function setName(obj){
obj.name = "Jack";
obj = new Object();
obj.name = "Rose";
}
var person = new Object();
setName(person);
alert(person.name); //Jack
這個例子中在setName()函數中,為obj重新定義了一個對象,另一行代碼為該對象定義了一個帶有不同值的name屬性。如果person傳遞給函數setName()之后是按引用傳遞的,那么對obj.name的修改就會反映到person.name上,事實上person.name依然是Jack。