接上文。
3. 函数的参数
3.1 形参与实参
函数就是方法,是一段可执行代码的集合。原则上,函数最好是死板的,只做一件事,并且同一个函数每次做的事情都一样。试着比较下面两个函数。
函数1:
function PrintOneToNine(){
for(var i=1;i<=9;i++){
console.log(i)
}
}
PrintOneToNine();
函数2:
function PrintThisToThat(x,y){
x<y?"":[x,y]=[y,x];
for(var i=x; i<=y; i++){
console.log(i);
}
}
PrintThisToThat(9,1);
你会发现这两个函数都打印了1到9共9个数字,结果是相同的。但函数2更具有可塑性。函数2之所以比函数1强大,是因为我们利用了参数。x和y就是函数2的参数。
函数之所以需要参数,是因为一个函数是经常需要和外部进行通讯的,根据实际需要来处理相同的事情。我们可以把函数想象成是一个面包机,主要任务是提供标准化的烘焙过程,所以不同的点心进去就会出来不同的面包,而不是每次都出来一样的面包。
上面的PrintThisToThat函数定义了2个参数,称之为2个形参。如果只给1个参数(实参),即执行PrintThisToThat(9)会怎么样?undefined.
3.2 参数缺省
可以看出,PrintThisToThat(9)是无法正常执行的。我们可以假设,用户输入PrintThisToThat(9)是想打印0到9这几个数字,那么我们怎么修改这个函数才能做到一样的功能?
function PrintThisToThat(x,y=0){
x<y?"":[x,y]=[y,x];
for(var i=x; i<=y; i++){
console.log(i);
}
}
PrintThisToThat(9);
运行上面这段代码,发现函数可以正常执行。区别在于我们在函数的定义时,同时对参数y进行了初始化赋值。那样,当调用时未提供y参数,则启用初始化的赋值。
3.3 参数在哪儿
还是上面的函数。如果执行PrintThisToThat("A","B")会怎么样呢?
很明显,传入的参数与我们的本意不符。原本我们只想打印两个数之间的数字,现在传过来了两个字母,当然不会处理了。为了提高函数的严谨性,有必要对参数进行验证,验证涉及到参数的类型,值,以及数量。在验证之前,我们需要知道参数在哪儿。
参数在函数体内部的arguments数组中。
function PrintThisToThat(x,y=0){
console.dir(arguments);
x<y?"":[x,y]=[y,x];
for(var i=x; i<=y; i++){
console.log(i);
}
}
PrintThisToThat(6);
PrintThisToThat(6,2);
arguments是一个数组,那么我们就可以利用数组的方法对参数进行校验。