前言
在函數調用時,arguments和this會被靜默的傳遞給函數,并可以在函數體內引用它們,借以訪問函數相關的一些信息。
其中arguments是一個類數組結構,它保存了調用時傳遞給函數的所有實參;this是函數執行時的上下文對象, 這個對象有些讓人感到困惑的行為。 下面分別對他們進行討論。
1. arguments
1.1 背景
JavaScript 允許函數在調用時傳入的實參個數和函數定義時的形參個數不一致, 比如函數在定義時聲明了 n 個參數, 在調用函數時不一定非要傳入 n 個參數,例如:
// 1. 定義有一個形參的函數fn()function fn(arg){}// 2. 在調用時傳入 0 個或 多個參數,并不會報錯fn(); // 傳入 0 個參數fn(1,'a',3); // 傳入多個參數1.2 arguments 與 形參的對應關系
arguments是個類數組結構,它存儲了函數在調用時傳入的所有實參, 通過訪問它的length屬性可以得到其中保存的實參的個數,并可以通過arguments[n]按順序取出傳入的每個參數(n=1,2,..,arguments.length-1)。
參數在arguments中保存的順序和傳入的順序相同, 同時也和形參聲明的順序相同,例如:
function fn(arg1, arg2, arg3){console.log(arg1 === arguments[0]); // trueconsole.log(arg2 === arguments[1]); // trueconsole.log(arg3 === arguments[2]); // true}fn(1,2,3); // 調用當傳入的實參多于形參個數時,想要獲得多余出的實參,就可以用arguments[n]來獲取了, 例如:
// 定義只有一個形參的函數function fn(arg1){ console.log('length of arguments is:',arguments.length);console.log('arguments[0] is:', arguments[0]); // 獲取傳入的第一個實參, 也就是形參 arg1 的值console.log('arguments[1] is:', arguments[1]); // 獲取第二個實參的值, 沒有形參與其對應console.log('arguments[2] is:', arguments[2]); // 獲取第二個實參的值, 沒有形參與其對應}fn(1,2,3); // 傳入 3 個實參// 可以得到實際上傳入的實參的個數并取出所有實參// length of arguments is: 3// arguments[0] is: 1// arguments[1] is: 2// arguments[2] is: 31.3 arguments 與 形參的值相互對應
在非嚴格模式下, 修改arguments中的元素值會修改對應的形參值;同樣的,修改形參的值也會修改對應的arguments中保存的值。下面的實驗可以說明:
function fn(arg1, arg2){// 1. 修改arguments元素,對應的形參也會被修改arguments[0] = '修改了arguments';console.log(arg1); // 2. 修改形參值,對應的arguments也會被修改arg2 = '修改了形參值';console.log(arguments[1]); }fn(1,2);// '修改了arguments'// '修改了形參值'但是,在嚴格模式下不存在這種情況, 嚴格模式下的arguments和形參的值之間失去了對應的關系:
新聞熱點
疑難解答
圖片精選