我們都知道在 ECMAScript 中,數(shù)據(jù)類型分為原始類型(又稱值類型/基本類型)和引用類型(又稱對象類型);這里我將按照這兩種類型分別對函數(shù)進(jìn)行傳參,看一下到底發(fā)生了什么。
參數(shù)的理解
首先,我們要對函數(shù)的參數(shù)有一個了解:
形參就是函數(shù)內(nèi)部定義的局部變量;
實參向形參傳遞值的時候,就是一個賦值操作,把實參的值直接復(fù)制一份給形參。
原始類型參數(shù)傳遞
示例1
var a = 1; function f(b) {
a = 3;
} f(a); console.info(a); // 3
示例1中的代碼比較簡單,解析如下:
- 首先,我們定義了一個變量 a,給它賦值為 1;又定義了一個函數(shù) f,函數(shù) f 的形參是 b(此時,相當(dāng)于在函數(shù) f 里定義了一個變量 var b; 它的值現(xiàn)在是 undefined);
- 調(diào)用函數(shù) f(a)把 a 作為實參傳入。這里可以理解為,給 b 進(jìn)行了一次賦值操作 b = 1;
- 接下來繼續(xù)執(zhí)行代碼 a = 3;注意:在函數(shù)體里邊,出現(xiàn)了一個變量 a ,但是它沒有用 var 關(guān)鍵字定義,所以,它是一個全局作用域的變量,不是這個函數(shù)的局部變量,而在一開始,我們就定義了這樣一個變量 a,所以在這里就是對之前的 a 進(jìn)行的又一次賦值操作,把 a 從之前的 1 變成了 3;
- 執(zhí)行完 f(a) 之后,把全局變量 a 的值改變了,所以,當(dāng)我們輸出 a 查看它的值時,就得到了 3 ,而對于函數(shù)的形參 b 根本沒有進(jìn)行任何操作而已。
示例2
var a = 1; function f(a) {