參數
函數內部可用的 arguments
對象來訪問函數的實參
注意
- 在函數遞歸調用的時候(在某一刻同一個函數運行了多次,也就是有多套實參),那么
arguments
屬性的值是最近一次該函數調用時傳入的實參 - 如果函數不在執行期間,那么該函數的
arguments
屬性的值是null
arguments
對象不是一個Array
。它類似於Array
,但除了length屬性和索引元素之外沒有任何Array
屬性。例如,它沒有 pop 方法,但是可以使用Array.prototype.pop.call(arguments,obj)借用Array方法- 使用擴展運算符的方法可以講arguments對象展開成一個真正的數組 例如:
var args = [...arguments];
- argument.callee 屬性包含正在執行函數,這在函數的名稱是未知時很有用,例如在沒有名稱的函數表達式 (也稱為“匿名函數”)內
//計算階乘 function factorial(n){ if(n == 1){ return 1 } return n*arguments.callee(n-1); } console.log(factorial(5));
bind 方法
JavaScript新手經常犯的一個錯誤是將一個方法從對象中拿出來,然后再調用,希望方法中的 this 是原來的對象(比如在回調中傳入這個方法)。如果不做特殊處理的話,一般會丟失原來的對象。從原來的函數和原來的對象創建一個綁定函數
var module = { x: 42, getX: function() { return this.x; } } var unboundGetX = module.getX; console.log(unboundGetX()); // 這里輸出的是全局環境下 x 變量
var boundGetX = unboundGetX.bind(module); //綁定對象
console.log(boundGetX()); // expected output: 42
箭頭函數
在箭頭函數出現之前,每個新定義的函數都有它自己的 this
值(在構造函數的情況下是一個新對象,在嚴格模式的函數調用中為 undefined,如果該函數被稱為“對象方法”則為基礎對象等)例如
function Person() { // Person() 構造函數定義 `this`作為它自己的實例.
this.age = 0; setInterval(function growUp() { // 在非嚴格模式, growUp()函數定義 `this`作為全局對象,
// 與在 Person()構造函數中定義的 `this`並不相同.
this.age++; }, 1000); } var p = new Person();
過去的解決辦法是在 Person中新建一個變量指向this 例如 var that = this
箭頭函數的出現解決了這個問題,箭頭函數不會創建屬於自己的this,它使用封閉執行上下文的this值。因此,在下面的代碼中,傳遞給setInterval的函數內的this與封閉函數中的this值相同
function Person(){ this.age = 0; setInterval(() => { this.age++; // |this| 正確地指向person 對象
}, 1000); } var p = new Person();
注意
- 箭頭函數不綁定Arguments 對象
- 箭頭函數只能用於非方法函數
- 箭頭函數不能作為構造函數
- 箭頭函數沒有property屬性
最后來看一下箭頭函數使用語法
(參數1, 參數2, …, 參數N) => { 函數聲明 } (參數1, 參數2, …, 參數N) => 表達式(單一) //相當於:(參數1, 參數2, …, 參數N) =>{ return 表達式; } // 當只有一個參數時,圓括號是可選的:
(單一參數) => {函數聲明} 單一參數 => {函數聲明} // 沒有參數的函數應該寫成一對圓括號。
() => {函數聲明}
默認參數
JS函數也可以在聲明參數時賦默認值,如果不給默認值,JavaScript 中函數的參數默認是undefined
function multiply(a, b = 1) { return a * b; }
剩余參數
剩余參數語法允許我們將一個不定數量的參數表示為一個數組
function(a, b, ...theArgs) { // ...
}
剩余參數和 arguments對象之間的區別主要有三個:
- 剩余參數只包含那些沒有對應形參的實參,而 arguments 對象包含了傳給函數的所有實參。
- arguments對象不是一個真正的數組,而剩余參數是真正的 Array實例,也就是說你能夠在它上面直接使用所有的數組方法,比如 sort,map,forEach或pop。
- arguments對象還有一些附加的屬性 (如callee屬性)