函式的參數--傳值或傳址

函式的參數--傳值或傳址:

函式的參數是用來與程式本體進行資料傳遞使用。一般傳遞參數的方式分為傳址或傳值。但Javascript不像C一樣,有特殊的運算子來決定傳值或傳址。而是以資料型態作為依據。

對Javascript而言,函式參數的資料型態若是基本的資料型態,像是數值,字串,布林值,則會是以傳值的方式來進行傳遞,而當參數若是物件時則是以傳址來進行。

下面用一個範例來看看其差別:

<script type="text/javascript">
var x=5;
var mystr="string-1";
var myarray= [ "Array0-1" , "Array0-2" ] ;
var myobj={
objstr:"test"
}
 
function changetest(intx,mystr,myattay,myobj){
intx=7;
mystr="string-2";
myarray[myarray.length]="Array0-3";
myobj.objstr="test2";
}
 
changetest(x,mystr,myarray,myobj);
 
document.writeln(x);
document.writeln("<br/>");
document.writeln(mystr);
document.writeln("<br/>");
document.writeln(myarray);
document.writeln("<br/>");
document.writeln(myobj.objstr);
document.writeln("<br/>");
</script>
輸出:
5
string-1
Array0-1,Array0-2,Array0-3
test2 
 
很明顯看得出來,基本資料型態的數值,字串都無法在函式中改變其值,原因就是因為參數傳遞的方式是傳值。而陣列與物件可以在函式中改變其值,原因是因為函式傳遞的方式是傳址。

PS:

傳值:

將變數的值傳遞至涵式內,因為是單純將"值"傳遞給函式,所以其實函式內的變數與原本變數是不同的2個變數,只是在開始時擁有相同的數值,在函式內改變其值並不會引響函式外的變數。

傳址:

將變數的位址傳遞至函式,函式內的變數與函式外的變數都是存取相同的變數位址。因此在函式內改變該值時,函式外的值也會改變。

觀念澄清:

我想在這裡特別說一下,所謂的傳址是以位址來做為傳遞。因此函式外的變數與函式內的變數,雖然是不同的變數,但是指向相同的位址。在這種情況下,用函式內的變數做為索引來改變位址內的資料,會引響到函式外的值。但是如果在函式內改變了函式內變數的參考位址。譬如說新定義了一個物件給變數,像這樣的改變就不會引響到函式外的變數。因為你已經給了函式內的變數一個新的索引了。圖解如下:

如果你想更了解其他函式觀念,可以參考看看下面這篇文章:函式 Function

我把許多函式的觀念與用法都收集在這篇文章內。

 
 

  按個讚!~支持本站!~

FB推薦載入中