函数的参数:
对于ECMAscript而言,函数参数个数多少并不会过于影响函数的执行,它也不会在意你传递的是什么数据类型,因为在ECMAscript内部,参数是以一个数组(类数组,arguments)来表示。函数接收到的永远是这个数组,而不会关心数组中存在哪些参数。假如:一个函数定义了两个形参,你可以什么参数都不传递,大不了内部计算报错是undefined而已,但是函数的确是在执行了。
与其他语言的区别,强类型语言在函数声明的时候会创建一个函数签名(即:函数名+参数列表(有的甚至包括参数类型)),将来的调用必须与函数签名一样。ECMAscript就不会验证函数签名,所以参数的个数嘛,whatever~
ECMAscript的参数还能和形参一起使用:
1 function intro_self(name,age){
2 console.log("我叫"+arguments[0]+",我今年"+age+"岁了。")
3 }
4 intro_self("谢某某",25)
上面的代码调用结果是:我叫谢某某,我建年25岁了。
代码中使用arguments[0]来代替name形参,一样能得到调用结果。
继续延伸
ECMAscript函数参数传递方式的验证:
函数参数的传递方式有【值传递】和【引用传递】,在验证之前,先简单解释一下【值传递】和【引用传递】的区别。
值传递其实就是将某一变量的值拷贝一份,然后传递给某个函数或者表达式参与计算,最终的结果对该变量没有任何影响。
引用传递呢?计算式将某些值存储在变量、对象等等身上,而变量和对象又存储在哪儿呢?答案是内存条,变量和对象存储着数据,其本身有存储在内存上某个制定的地址上。而引用传递就是将这个特定的内存地址传递给另一个变量或者对象参与计算,这就会从源头影响到当前变量或者对象。
下面来验证一下,ECMAscript的参数传递方式:
1 var age_num=25
2 function intro_self(age){
3 age=100;
4 console.log(age);
5 }
6 intro_self(age_num);
7 console.log(age_num);
最终得到的结果是100、25。
明明,在函数内部更改了age_num的值,可是再一次console.log的时候发现age_num还是25,由此可以看出,函数内部参与计算的值访问的地址和外界的age_num变量访问的内存地址并不一样,所以由此可以知道,ECMAscript的参数传递方式是【值传递】
ECMAscript函数的重载问题:
什么是重载?
举个栗子:
某天因为需求问题需要做一个功能,输入不同内容得到不同的结果,如果有一百种结果难道要写一百个不同的函数?这样的话估计整个人都不好了,本身很简单的功能,却在开发过程中把程序员逼疯。怎么办?在Java等强类型语言中可以为一个函数编写两个定义,只要当前函数的签名(参数类型和数量)不一样即可,这样就实现了重载功能:
1 class TempClass{
2 public viod cal(){
3 System.out.printIn("请输入数值");
4 }
5 public viod cal(int num1,String num2){
6 System.out.printIn("num1是整形,num2是字符串");
7 }
8 public viod cal(String num1,String num2){
9 System.out.printIn("num1和num2都是字符串")
10 }
11 }
上面三个方法名都一样,只是函数签名不一样,这样在调用的时候符合不同签名即可实现结果,而不需要针对某一个功能去书写很多不同名称的函数。
可是,ECMAscript不存在函数签名,所以,它无法实现【真正的函数重载】
如果定义两个名字一样的函数,后面定义的函数会把前面的函数覆盖掉
但是,可以使用比较巧妙的方式来实现ECMAscript的函数重载,比如判断参数类型等等。