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