js没有函数重载的原因

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]+'<br>');
  	}
}
document.writeln(add.length+'<br>');//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+'<br>');//得到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+'<br>');//得到0,1,3,24
document.writeln('0'<1);//得到true,字符串可以和数比较?js这么聪明。。无语


你可能感兴趣的:(js,函数,对象)