1. 程式人生 > >Javascript函式形參與實參

Javascript函式形參與實參

形參,是在定義函式時使用的引數,目的是用來接收呼叫該函式時傳進來的實際引數。
實參:是在呼叫時傳遞給函式的引數
例如

function myfun(a,b,c){
    ...  
}
myfun(1,2,3);

這裡a,b,c就是形參。1,2,3為實參。
形參和實參是不同的變數,他們在記憶體中處於不同的位置,形參在函式執行結束時將被釋放。

主要有兩點需要注意的

1 . 如果實參是引用型別(object,array等),那麼對相對的形參進行更改,是否會影響到實參的值

var obj = {
    name:'obj',
    age:12
}
function myfunc
(objtemp){
objtemp.name='func'; alert(objtemp.age); //12 } myfunc(obj); alert(obj.name); //func

那麼最後一句:alert(obj.name);會輸出什麼呢,答案是func。
函式引數傳遞包含兩種方式:值傳遞和引用傳遞。
值傳遞:形參是實參值的一個副本,對形參的改變不會影響實參
引用傳遞:形參實際上是對實參引用變數的複製,導致這實參、形參都指向同一個物件實體。形參改變會同時改變實參的值。
可以這樣理解:myfunc(obj);可以看作是

objtemp = obj;
objtemp.name = 'func'
; alert(objtemp.age);

舉例說明:

var arr= ['obj1','obj2','obj3']
function myfunc(arrtemp){
    arrtemp[1] = 'myfunc';
    alert(arrtemp);  
}
myfunc(arr);  //obj1,myfunc,obj3
alert(arr[1]); //myfunc

2 . 形參與區域性變數重名情況的處理。

function myfunc(a){
    alert(a);        //hello
    var a = a+'world';
    var b = a; 
    alert(a);        //helloworld
alert(b); //helloworld } myfunc("hello");

由於“變數宣告提升”,當執行到第一個alert(a)時,形參a已經存在。區域性變數a只宣告而未賦值,記憶體中還未建立區域性變數a。這時候alert(a),a 表示形參,所以輸出“hello”。
執行var a = a+’world’;時,右邊的a是形參,左邊的a是區域性變數。這兩個a互不干擾。但這一句執行完成後,區域性變數a已經覆蓋了形參a。所以後面的b=a時,a為區域性變數。

綜合來說,當局部變數未宣告或只宣告而未賦值時,記憶體中還沒有這個變數,這時候呼叫的同名變數是形參。當局部變數賦值完成後,記憶體中已經存在這個變數,並且覆蓋了同名的形參。後面再呼叫該變數時,就指的的區域性變量了。
舉例: