js中没有方法重载的概念:
function haha(n1,n2){ return n1+n2;}function haha(){ return 3;}alert(haha(2,10));alert(haha());
不管参数如何,两次都输出3,而且没有报错,原因function也是对象,haha是一个函数指针。相对于java,这点更像c#中的函数指针(嗨。。又吧js和其他语言相提并论了)。
以上代码其实等价于:
var haha = function (n1,n2){ return n1+n2;}haha = function (){ return 3;}alert(haha(2,10));alert(haha());
这样就明白为什么两个重名函数没有报错了,因为haha只是个指针,它指向了新的函数对象。
进一步等价为:
var haha = new Function ('n1','n2','return n1+n2;');haha = new Function ("return 3;");alert(haha(2,10));alert(haha());
这里给出了构造Function对象的方法,最后一个参数是函数体里要执行的语句,其他参数就是原来的参数;都以字符串的形式。
实际参数个数并不重要,因为Function默认有一个arguments数组对象,不管你传几个参数:
function add(n1,n2){ for(var i in arguments){ document.writeln(i+' = '+arguments[i]+''); }}document.writeln(add.length+'');//add.length是函数期望的参数个数add(3,4,5,6,7,'abc',true);add();//也不会报错
可以在函数体中判断参数个数和类别,实现重载。不过这就是js灵活的地方,干嘛非要重载
关于函数指针这里还有一个例子:
var a = [1,3,24,'0'];a.sort();//a.sort默认是把比较元素toString()之后的字符串document.writeln(a+'');//得到0,1,24,3 function ascent(a,b){ if(a < b){return -1;} else if(a==b){return 0;} else{return 1;}}a.sort(ascent);//把函数指针作为参数传进去 document.writeln(a+'');//得到0,1,3,24document.writeln('0'<1);//得到true,字符串可以和数比较?js这么聪明。。无语