一直認為javascript函數的參數是普通的傳值,對象的傳址.
今天想把一個對象傳到函數裡面去重建後傳出來,才知道我還是有地方理解錯了.
先看http://beba-brook.blogspot.com/2006/06/vs.html的一段代碼:
<html>
<body>
<script>
/*函數宣告
*********************/
function FuncA(num,bool){//測試數值和布林
num++;
bool=false;
document.write("在函數FuncA中的變數num值為:"+num+";變數bool值為"+bool+"<br/>");
}
function FuncB(str,man){//測試字串和物件
str="骷髏紳士";
man.name="劍俠鼻唄";
document.write("呼叫FuncB時:"+str+";"+man.name+"<br/>");
}
/*測試
*********************/
var num=1; //數值
var bool=true; //布林
var str="布魯克"; //字串
var man=new Object(); //物件
man.name="布魯克";
document.write("呼叫FuncA前,變數num的值為:"+num+"。變數bool的值為
:"+bool+"<br/>");
FuncA(num,bool);
document.write("呼叫FuncA後,變數num的值為:"+num+"。變數bool的值為
:"+bool+"<br/>");
document.write("呼叫FuncB前:"+str+"。"+man.name+"<br/>");
FuncB(str,man);
document.write("呼叫FuncB後:"+str+"。"+man.name+"<br/>");
</script>
</body>
</html>
運行結果沒問題,與我想象的一樣:
呼叫FuncA前,變數num的值為:1。變數bool的值為:true
在函數FuncA中的變數num值為:2;變數bool值為false
呼叫FuncA後,變數num的值為:1。變數bool的值為:true
呼叫FuncB前:布魯克。布魯克
呼叫FuncB時:骷髏紳士;劍俠鼻唄
呼叫FuncB後:布魯克。劍俠鼻唄
但,如果在FuncB中加一句
str="骷髏紳士";
man=new Object();
man.name="劍俠鼻唄";
結果:
呼叫FuncB前:布魯克。布魯克
呼叫FuncB時:骷髏紳士;劍俠鼻唄
呼叫FuncB後:布魯克。布魯克
新的man對象並沒有返回來.
所以,我現在要這樣理解,javascript都是拷貝值的,只是對象拷貝的是對象的地址,所以通過地址引用,可以修改其中的屬性.但如果在程式內部更改了這個地址,它是不會傳回來的.
不再折騰了,要想修改東西,還是用return來實現.