Effective JavaScript Item 21 使用apply方法调用函数以传入可变參数列表

本系列作为Effective JavaScript的读书笔记。

 

以下是一个拥有可变參数列表的方法的典型样例:


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

毫无疑问,拥有可变參数列表的方法更加简洁和灵活,它能够处理随意多的參数。可是当參数是一个数组时,怎样调用拥有可变參数列表的方法呢?

 

答案是使用内置的apply方法,这种方法和call方法十分类似,除了apply方法是接受一个数组作为參数,然后会将该数组中的每一个对象当成单独的參数进行调用。同一时候,apply方法的第一个參数同call方法的第一个參数意义一样,用来指定this的指向。所以,结合apply方法,就能够处理数组类型的參数了:


var scores = getAllScores();
average.apply(null, scores);

如果scores是一个拥有三个元素的数组,那么上述调用实际上就是:


average(scores[0], scores[1], scores[2]);

还有一个样例是将apply运用到依赖arguments变量的方法中,关于arguments变量的意义和使用方法,參见Item 22


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方法后,能够这样调用:


buffer.append.apply(buffer, getInputStrings());

须要注意的是,在调用apply的时候,传入了buffer对象作为this的指向,这是由于在append的实现中依赖了this变量,须要显式传入该依赖才干确保改动发生在了正确的对象上。

 

总结:

  1. 使用apply方法来将数组类型的參数传入到接受可变參数列表的方法中
  2. 使用apply方法的第一个參数来指定this的指向

posted @ 2015-03-10 19:29  zfyouxi  阅读(145)  评论(0编辑  收藏  举报