js中函式引數值傳遞和引用傳遞

antzone發表於2017-04-17

一.函式傳遞值型別:

程式碼例項如下:

[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本身的值並沒有被改變,函式中被改變的值僅僅是一個副本而已。

二.函式傳遞引用型別:

[JavaScript] 純文字檢視 複製程式碼
function setName(obj){ 
  obj.name="青島新銳"; 
} 
var web=new Object(); 
web.name="螞蟻部落";
setName(web); 
console.log(web.name);

以上程式碼的彈出值是:“青島新銳”,下面進行一下分析:

宣告一個物件web,它是一個引用型別,當為函式傳遞引數的時候,是傳遞的web物件的引用,也就是此物件的記憶體地址,所以在函式中修改屬性的物件就是函式外面建立的物件本身。

三.加深理解:

[JavaScript] 純文字檢視 複製程式碼
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屬性不會被改變。

相關文章