average函数是一个称为可变参数或可变元的函数的例子。它可以接收任意数量的参数。
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
固定元数的average函数的版本可能会使用单个数字数组作为其参数。
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
可变参数的版本更加简洁。可变参数函数具有便捷的语法,让调用者预先明确地知道提供了多少个参数。
var scores = getAllScores( );
如何使用average函数计算其平均值呢?
average(/* ? */);
函数对象配有一个内置的apply方法。它与call方法非常类似。apply方法需要一个参数数组,然后将数组的每一个元素作为调用的单独参数调用该函数。除了参数数组,apply方法指定第一个参数绑定到被调用函数的this变量。由于average函数没有引用this变量,我们可以简单地传递null。
var scores = getAllScores();
average.apply(null,scores);
如果scores有三个元素,那么以上代码的行为与average(scores[0],scores[1],scores[2])一致。
apply方法也可用于可变参数方法。例如,butter对象包含一个可变参数的append方法,该方法添加元素到函数内部的state数组中。
var butter = {
state:[],
append:function(){
for(var i=0,n<arguments.length;i<n;i++){
this.state.push(arguments[i]);
}
}
};
append方法可以接受任意数量的参数进行调用。
butter.append("Hello,");
butter.append("firstName","","lastName","!");
butter.append(newline);
借助于apply方法的this参数,我们可以指定一个可计算的数组调用append方法:butter.append.apply(butter,getInputStrings());
总结:
使用apply方法指定一个可计算的参数数组来调用可变参数的函数。
使用apply方法的第一个参数给可变参数的方法提供一个接收者。