我的相片
劍俠鼻唄
如果一個人會不依著同伴的步伐前進,有可能是因為他聽到了另一種鼓聲。
檢視我的完整簡介

2006年6月23日 星期五

傳值呼叫VS.傳址呼叫測試(JavaScript)

傳值呼叫VS.傳址呼叫測試(JavaScript)



/*函數宣告
*********************/
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/>");


/*測試結果
*********************************/





1.可以發現資料型態為,數值、布林、字串的變數,不論在函數中如何更動,事後調出來看,變數的值仍是不會變。(更動的是函數中同名的區域變數。)
2.在最後一列可以看到,物件屬性值為布魯克,在經函數變動後,往後它的值就會一直是劍俠鼻唄。除非有再更動過。

2 則留言:

  1. 但,如果在FuncB中加一句
    man=new Object();
    结果,新的man对象并没有返回来.

    我是这样理解,javascript都是拷贝值的,只是对象拷贝的是对象的地址,所以通过地址引用,可以修改其中的属性.但如果在程序内部更改了这个地址,它是不会传回来的.

    回覆刪除
  2. 是極是極。兄台所言甚是。
    如果在FuncB中加一句
    man=new Object();
    則生了個新物件予man,則nam中所載的位址就被更動了。
    除非return,否則函數執行完就没了。
    布魯克不常在家,所有意見最早於週六週日才會得見。
    有大俠自遠方來,布魯克招待不周,還請多多擔待。

    回覆刪除

歡迎任何人發表高見,不歡迎任何跟自身見解無關的行為。
所有意見最早於週六週日才會得見,多謝包涵。不想公開的悄悄話請自行註明。