同java一樣,javascript中參數也只有值傳遞。這點同變量的訪問不同,變量的訪問可以有按值和按引用兩種方式。以下分為基本數據類型和引用數據類型說明。
1.基本數據類型
在向參數傳遞基本數據類型的值時,被傳遞的值會被復制給一個局部變量(命令參數,或者是argument對象中的一個元素)。
1 function addTen(num){ 2 num += 10; 3 return num; 4 } 5 var count = 20; 6 var result = addTen(count); 7 alert(result); //30 8 alert(count) //20,沒有變化
在調用函數時,變量count作為參數傳遞給函數,這個變量的值是20。數值20被復制給參數num以便在函數內部使用。在函數內部num被加了10,但是並不會影響到count變量。
count和num的相互獨立,僅僅是具有相同的值而已。如果是按照引用傳遞的話,變量count的值應該為30,所以。。。。
2.引用類型
在向參數傳遞引用類型的值時,會把這個值在內存中的地址復制給一個局部變量,因此這個局部變量的變化會反映在函數的內部。
function setName(obj){ obj.name = "nick"; } function setNameEx(obj){ obj = new Object(); obj.name = "grge"; } var person = new Object(); setName(person); alert(person.name); //nick setNameEx(person); alert(person.name);//nick
可以看出,在setName函數中,obj和person引用的是同一個對象,所以obj添加name值會反映在person。在setNameEx中,obj對象重新定義了一個對象,這樣他指向的對象就和person不一樣了,所以他添加name值並不會影響到person。如果是引用傳遞的話,person就會自動被修改為指向name屬性為“grge”的對象。
可以把javascript中函數的參數想象成局部變量。