JavaScript中函式引數的值傳遞和引用傳遞

2021-08-02 20:44:50 字數 1044 閱讀 5100

結論:對於數字、字串等是將它們的值傳遞給了函式引數,函式引數的改變不會影響函式外部的變數。

對於陣列和物件等是將物件(陣列)的變數的值傳遞給了函式引數,這個變數儲存的指向物件(陣列)的位址。當函式改變這個位址指向的物件(陣列)的內容時,同時也改變了函式外部變數指向的物件(陣列)的內容;當函式改變的是變數的位址時,實際就與函式外部的變數失去了聯絡,變成了完全不同的物件了,不會對函式外部物件造成改變。

var v1 =

var v2 = {};

var v3 = {};

function foo(v1, v2, v3)

} foo(v1, v2, v3);

alert (v1); 

// 空白 

alert (v2); 

// [object object] 

alert (v3.a); 

// undefined

由此可見:v1、v2、v3 都沒有被改變,v1 仍然是零個元素的陣列,v2、v3 仍然是空白的物件。

但是,陣列、物件等按值傳遞,是指變數位址的值。

陣列、物件等的按值傳遞與數字、字串還是有所不同的。數字、字串是把值直接複製進去了,而陣列、物件是把變數位址複製進去的。

前面我們讓 v1、v2、v3 作為引數進入函式後,就有了位址副本,這些位址副本的指向和外面的 v1、v2、v3 的位址指向是相同的。但我們為 v1、v2、v3 賦了值,也就是說我們把位址副本的指向改變了,指向了新的陣列和物件。這樣內部的 v1、v2、v3 和外部的 v1、v2、v3 就完全斷了。

如果我們不賦新值,而是直接操作它,那麼,它操作到的,仍然是和外面的 v1、v2、v3 指向的同一塊陣列或物件。

var v1 =

var v2 = {};

var v3 = ;

function foo(v1, v2, v3)

foo(v1, v2, v3);

alert (v1); 

// 1 

alert (v2.a); 

// 2 

alert (v3.a); 

// 3

javaScript中函式的引數

函式不介意傳遞進來多少個引數,也不在乎傳進來引數是什麼資料型別,原因是 ecmascript 中的引數在內部是用乙個陣列來表示的。函式接收到的始終都是這個陣列,而不關心陣列中包含哪些引數 如果有引數的話 在函式體內可以通過 arguments 物件來訪問這個引數陣列,從而獲取傳遞給函式的每乙個引數,...

Javascript函式引數傳遞

js中所有函式引數傳遞都是值傳遞 棧記憶體為自動分配的記憶體空間,它由系統自動釋放 堆記憶體則是動態分配的記憶體,大小不定也不會自動釋放。值型別 基本型別 字串 string 數字 number 布林 boolean 對空 null 未定義 undefined symbol es6新增 引用資料型別...

javascript中函式引數是evt詳解

一般情況下,在js中函式可能沒有引數,也有特殊情況,舉個例子 function togglecolor evt else if thissquare.classname else 先簡單介紹一下這個函式的作用 在乙個包含了若干卡片 的.html檔案中,單擊任何乙個小卡片改變卡片的背景顏色,再次單擊該...