日期:2014-05-16  浏览次数:20370 次

JS-函数,重载.
如果函数无明确的返回值,或调用了没有参数的return 语句,那么它真正返回的值是: undefined.

JS无重载:
重载,就是同时存在两个名称相同的函数,但它们的接收参数不同或返回值不同;在JAVA中经常会遇到.但在JS中,如果同时存在两个相同的名字的函数,它不会引发错误,但它会真正使用最后一个;如:
function doit(iNum){
?? ?alert(iNum + 100);
}
function doit(iNum){
?? ?alert(iNum + 10);
}
我们执行:doit(10)时,它会alert出20;因为第二个覆盖了第一个定义.要想实现重载,必须使用下面的:argument

arguments 对象

在函数中,我们可以直接使用arguments对象,它是一个对象,但访问方式和数组一样:arguments[0]...,arguments.length;等;如:
function sayHi(){
?? ?if(arguments[0] == "bye"){
?? ? ? ?return;
?? ?}
?? ?alert(arguments[0]);
}
还可以用arguments.length来查看函数当前接收的参数的个数,如:
function howManyArgs(){
?? ?alert(arguments[0].length);
}
howManyArgs("a",4); ? ?//alert 2
howManyArgs(); ? ? ? ? //alert 0
howManyArgs(33); ? ? ? //alert 1

从上面的代码又可以看出:
ECMAScript不会验证传递给函数的参数个数是否等于函数定义的参数个数.开发者定义的函数都可以接受任意个数的参数,最多能接受25个,而且不会引发任何错误.任何遗漏的参数都会以undefined传递给函数,多俄的参数将被忽略.

用 arguments?模拟重载:
function doit(){
?? ?if(arguments.length == 1){
?? ? ? ?alert(arguments[0] + 10);
?? ?}else if(arguments.length == 2){
?? ? ? ?alert(arguments[0] +?arguments[1]);
?? ?}
}

Function 类
我们用的函数,它实际上也是一个类;我们声明一个函数,就相当于创建了一个Function类的实例;Function类实例化的格式是:var funcName = new Function(arg1,arg2,....argN,functionBody);如
我们声明函数的时候用:
function funcName(arg1,arg2){
?? ?alert(arg1 + arg2);
}
这种格式来声明,但它实际上的含义是:
var funcName = new Function("arg1","arg2","alert(\"arg1\" + \"arg2\")");
但这种方式书写不方便,但让我们理解了Function类的存在.
记得上面说JS无重载的时候举的例子:
function doit(iNum){
?? ?alert(iNum + 100);
}
function doit(iNum){
?? ?alert(iNum + 10);
}
它实际上的内容是:
doit = new Function("iNum","alert(iNum + 100)");
doit = new Function("iNum","alert(iNum + 10)");
这样看起来就很容易理解为什么后面的会把前面的覆盖了.
因为Function也是一个对象,而声明的时候实际上是将该对象的指针给了函数名.所以可以将多个指针指向同一个Function.如:
var?doit = new Function("iNum","alert(iNum + 10)");
var alsoDo = doit;
doit(11);
alsoDo(11);
两者效果一样;
既然知道了函数名实际上是一个对象的指针,那么我们就可以将函数名传递给其他函数,并做调用;如:
function callAnotherFunc(fnFunc,vArgs){
?? ?fnFunc(vArgs);
}