Effective JavaScript Item 21 使用apply方法調用函數以傳入可變參數列表

本系列做爲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 22code


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

 

總結:

  1. 使用apply方法來將數組類型的參數傳入到接受可變參數列表的方法中
  2. 使用apply方法的第一個參數來指定this的指向
相關文章
相關標籤/搜索