`
longzhun
  • 浏览: 360174 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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);
}
doit = new Function("iNum","alert(iNum + 10)");
callAnotherFunc(doit,10);
Function类还提供了另外一个接口:length属性,用来返回该类声明的接收参数的长度;如:
function doit(iNum){alert(iNum + 10)}
function hello(){alert("hello");}
alert(doit.length);     //alert 1
alert(hello.length);    //alert 0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics