js中函數參數值傳遞和引用傳遞:
在閱讀本章節之前建議參閱一下兩章節:
1.值類型可以參閱javascript的值類型一章節。
2.引用類型可以參閱javascript的引用類型一章節。
一.函數傳遞值類型:
代碼實例如下:
function addNum(num) { num+=10; return num; } var num=10; var result=addNum(num); console.log(num); console.log(result);
以上代碼的彈出值分別為:10和20,下面進行一下分析:
聲明變量num並復制為10,這個是num是一個值類型,當為函數傳遞參數的時候,是將此值復制一份傳遞給函數,所以在函數執行之后,num本身的值並沒有被改變,函數中被改變的值僅僅是一個副本而已。
二.函數傳遞引用類型:
function setName(obj) { obj.name="青島新銳"; } var web=new Object(); web.name="螞蟻部落"; setName(web); console.log(web.name);
以上代碼的彈出值是:“青島新銳”,下面進行一下分析:
聲明一個對象web,它是一個引用類型,當為函數傳遞參數的時候,是傳遞的web對象的引用,也就是此對象的內存地址,所以在函數中修改屬性的對象就是函數外面創建的對象本身。
三.加深理解:
function setName(obj) { obj.name="青島新銳"; obj=new Object(); obj.name="螞蟻部落"; } var web=new Object(); setName(web); console.log(web.name);
以上代碼的彈出值是:青島新銳,很多人可能會以為將會彈出“螞蟻部落”,下面進行一下簡單的分析:
在函數外面創建一個對象,並將對象的引用賦值給變量web,web中存儲的是對象在內存中的存儲地址,當為函數傳遞參數時,就是傳遞的在函數外面創建的對象的地址。在函數中,為外面創建的對象創建一個自定義屬性name並賦值為“青島新銳”,然后又創建一個新的對象,並將新對象的地址賦值給obj,這個時候obj指向的並不是函數外面創建的對象,所以外面對象name屬性不會被改變。
原文地址是:http://www.softwhy.com/forum.php?mod=viewthread&tid=9052
更多內容可以參閱:http://www.softwhy.com/javascript/