Javascript函式形參與實參
阿新 • • 發佈:2019-02-14
形參,是在定義函式時使用的引數,目的是用來接收呼叫該函式時傳進來的實際引數。
實參:是在呼叫時傳遞給函式的引數
例如
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為區域性變數。
綜合來說,當局部變數未宣告或只宣告而未賦值時,記憶體中還沒有這個變數,這時候呼叫的同名變數是形參。當局部變數賦值完成後,記憶體中已經存在這個變數,並且覆蓋了同名的形參。後面再呼叫該變數時,就指的的區域性變量了。
舉例: