本系列做爲Effective JavaScript的讀書筆記。javascript
如下是一個擁有可變參數列表的方法的典型樣例:java
average(1, 2, 3); // 2 average(1); // 1 average(3, 1, 4, 1, 5, 9, 2, 6, 5); // 4 average(2, 7, 1, 8, 2, 8, 1, 8); // 4.625
而下面則是一個僅僅接受一個數組做爲參數的樣例:數組
averageOfArray([1, 2, 3]); // 2 averageOfArray([1]); // 1 averageOfArray([3, 1, 4, 1, 5, 9, 2, 6, 5]); // 4 averageOfArray([2, 7, 1, 8, 2, 8, 1, 8]); // 4.625
毫無疑問,擁有可變參數列表的方法更加簡潔和靈活,它可以處理隨意多的參數。但是當參數是一個數組時,怎樣調用擁有可變參數列表的方法呢?app
答案是使用內置的apply方法,這種方法和call方法十分相似,除了apply方法是接受一個數組做爲參數,而後會將該數組中的每個對象當成單獨的參數進行調用。同一時候,apply方法的第一個參數同call方法的第一個參數意義同樣,用來指定this的指向。因此,結合apply方法,就可以處理數組類型的參數了:this
var scores = getAllScores(); average.apply(null, scores);
若是scores是一個擁有三個元素的數組,那麼上述調用實際上就是:spa
average(scores[0], scores[1], scores[2]);
還有一個樣例是將apply運用到依賴arguments變量的方法中,關於arguments變量的意義和使用方法,參見Item 22。code
var buffer = { state: [], append: function() { for (var i = 0, n = arguments.length; i < n; i++) { this.state.push(arguments[i]); } } };
append方法可以使用隨意多的參數進行調用,因爲它在實現中依賴了arguments變量:對象
buffer.append("Hello, "); buffer.append(firstName, " ", lastName, "!"); buffer.append(newline);
使用apply方法後,可以這樣調用:ip
buffer.append.apply(buffer, getInputStrings());
需要注意的是,在調用apply的時候,傳入了buffer對象做爲this的指向,這是因爲在append的實現中依賴了this變量,需要顯式傳入該依賴才幹確保改動發生在了正確的對象上。unicode
總結: