1. 程式人生 > >js中函式引數傳遞

js中函式引數傳遞

js中的引數傳遞是按照引數型別的不同,傳遞方法不同。如果是基本型別的傳遞,則傳遞的是值的副本,形參和實參是兩個獨立的個體,如果是引用型別的傳遞,那麼傳遞的是這個值在記憶體中的地址的副本,區域性變數的變化會表現在函式外部。
舉例子說明一下:

function addTen(num){
num+=10;
return num;}

var count=20;
var result=addTen(count);
alert(count);//20
alert(result);//30

這裡num作為形參,count作為實參,在進行傳遞的時候,count的值被複制給num,在加十以後,賦給result,因此result的值是30,而count作為一個獨立的變數,依然還是20的值沒有變。
這裡寫圖片描述

若傳遞的是物件的話,實參傳給形參的是一個地址的複製:

function setName(obj){
obj.name="Nicholas";
}

var person=new Object();
setName(person);
alert(person.name);//Nicholas

在建立變數時,person指向了一個新的記憶體區域,呼叫函式時,person將該區域的地址複製給了obj,此時obj和person指向同一塊記憶體區域,這時若是對obj進行操作,就會同時影響到person
這裡寫圖片描述
需要注意的是,並不是所有情況下,對形參的改變都會影響實參,如下程式碼:

function setName
(obj){
obj.name="Nicholas"; obj=new Object(); obj.name="Greg"; } var person=new Object(); setName(person); alert(person.name);//Nicholas

當呼叫setName函式時,將person的地址複製給obj,二者指向同一塊記憶體,obj將其name屬性賦值為Nicholas,此時person的name屬性也是Nicholas,接下來的

obj=new Object();
obj.name="Greg";

obj指向了一塊新的記憶體,並將其name屬性賦值為Greg,但是此時person的name屬性並未更改,也就是說,這個時候的obj和person並不是指向同一塊記憶體,同時,在函式結束以後,obj指向的區域也就消失了。類比一下,我們可以認為obj是一個快遞員,呼叫函式的時候,相當於obj按照person家的地址給person送了個name,然後在obj=new Object();的時候,他又給別人送屬性去了,和person沒有什麼關聯了。

obj.name=Nicholas
這裡寫圖片描述
obj=new Object();
obj.name=”Greg”;
這裡寫圖片描述

所以函式的引數傳遞問題,其實質就是 “形參就是函式的區域性變數”,以看待區域性變數而不是引數的角度去看待它,就容易區分出來值傳遞和引用傳遞的區別了,在別的語言中依然通用。