形參,是在定義函數時使用的參數,目的是用來接收調用該函數時傳進來的實際參數。
實參:是在調用時傳遞給函數的參數
例如
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,obj3alert(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為局部變數。
綜合來說,當局部變數未聲明或只聲明而未賦值時,記憶體中還沒有這個變數,這時候調用的同名變數是形參。當局部變數賦值完成後,記憶體中已經存在這個變數,並且覆蓋了同名的形參。後面再調用該變數時,就指的的局部變數了。
舉例: