JavaScript学习笔记之Function对象
在JavaScript中,函数function就是对象。
JS中没有方法重载
在JavaScript中,没有方法(函数)重载的概念。
例子:
<html> <head> <scripttype="text/javascript"> functionadd(number) { alert(number+20); } functionadd(number,number1) { alert(number+30); } add(10); </script> </head> <body> </body> </html>
网页中弹框显示的是40。
说明虽然第二个方法是两个参数,但是仍然调用了它。
交换两个方法的顺序之后,弹框显示30,可以看出不管参数个数如何,是调用同名的后面的方法。
怎么解释这个现象?
这是因为函数声明实际上是建立了一个对象:
<html> <head> <scripttype="text/javascript"> functionadd(number) { alert(number+20); } /* 上面的函数等价于: varadd=function(number) { alert(number+20); } */ functionadd(number,number1) { alert(number+30); } /* 上面的函数等价于: varadd=function(number,number1) { alert(number+30); } */ add(10); </script> </head> <body> </body> </html>
这样add实际指向的是后面的对象,而方法调用的时候赋予的参数将会按顺序赋给方法形式参数,后面没有被赋值的参数就是undefined。
JavaScript的函数调用的时候没有严格的参数个数检查,实参个数小于形参个数是可以的,没有被赋值的形参就是未定义值undefined。
实参个数大于形参个数也是可以的,这样只有前面的实参会被使用,多出来的实参不会被使用。
Function对象
在JavaScript中有一个Function对象,所有自定义的函数都是Function对象类型的。
Function对象接收的所有参数都是字符串类型的,其中最后一个参数就是要执行的函数体,而前面的参数则是函数真正需要接收的参数。
例子:
<html> <head> <scripttype="text/javascript"> varadd=newFunction("number","number1","alert(number+number1);"); varadd=newFunction("number","alert(number+20);"); add(10,30); </script> </head> <body> </body> </html>
隐含对象arguments
在JavaScript中,每个函数都有一个隐含的对象arguments,表示给函数实际传递的参数。
arguments和函数的形式参数及其个数无关。
arguments有个有用的属性length,表示实参的长度。可以借助这个来模拟出函数的重载:
练习例子:
<html> <head> <scripttype="text/javascript"> functionadd(number1,number2) { alert(arguments.length); alert(arguments[0]); alert(arguments[1]); alert(arguments[2]); } //add(2,3,4); functionadd2() { if(1==arguments.length) { alert(arguments[0]); } elseif(2==arguments.length) { alert(arguments[0]+arguments[1]); } elseif(3==arguments.length) { alert(arguments[0]+arguments[1]+arguments[2]); } } add2(3); add2(3,4); add2(3,4,5); </script> </head> <body> </body> </html>
每一个函数对象都有一个length属性,表示该函数期望接收的参数格式。
它与函数的arguments不同,arguments.length表示函数实际接收的参数个数。
例子:
<html> <head> <scripttype="text/javascript"> varadd=function(num,num2,num3) { alert(num+num2+num3); } alert(add.length);//输出3 add(1,2,3); varadd2=function() { } alert(add2.length);//输出0 </script> </head> <body> </body> </html>