首页 > 怎么样深入理解js中为什么没有重载呢

怎么样深入理解js中为什么没有重载呢

很难理解函数名是函数对象的指针

function addSomeNumber(num){
    return num+100;
}
function addSomeNuber(num){
    return num+200;
}
var result=addSomeNumber(100);//300

我知道后面覆盖了前面的函数,自己已经测试了结果,知道没有重载,但是就没法真正理解,只是接受了这个概念没有融化为自己的


其实很简单,因为方法签名用来唯一确定一个方法,签名包括方法名、参数类型、参数顺序。
但是JavaScript中并没有“类型”,所有类型都是一个var搞定。。所以也就没法唯一确定一个方法了。。既然没法唯一确定一个方法,那你调用的时候,我咋知道你要调用那个?JS引擎总不能随机的替你调用一个吧。。

----------------低调的分割线---------------

假如说,JavaScript中有类型,那么你写的方法或函数就类似于下面这样:


// A:

function method(String a,int b){

   // do something ...
   
}

好,咱们重载一下(就是参数换换位置而已):


//B:

function method(int b,String a){

   // do something ...
   
}

上面两个重载方法,怎么调用呢?


 // 第一个参数是字符串类型,第二个参数是整数类型,所以毫无疑问你调用的是A
 method("星空你好呀",100); 

 // 第一个参数是整数类型,第二个参数是字符串类型,所以毫无疑问你调用的是B
 method(100,"星空你好呀"); 

但是现实显然不是这样的。。

残酷的现实来了:

function method(var a,var b){

   // do something ...
   
}

好,咱们重载一下???:

function method(var b,var a){

   // do something ...
   
}

调用一下?


 method("星空你好啊",100);
 
 method(100,"星空你好啊");

好吧,那我请问你,JS引擎到底该调用A还是B ?所以这就是JS中没有重载的原因


js函数的参数个数可以不确定, 所以你可以在函数内部通过判断参数个数或者类型来实现重载

譬如

function add(num1, num2) {
    if(arguments.length == 1) {
        return num1;
    }
    if(arguments.length == 2) {
        return num1 + num2;
    }
}

重载函数就是名字相同但是参数类型不同的函数。js没有重载就是说,他不允许有名字相同的函数,如果你声明了两个名字相同的函数,后一个就会覆盖掉前一个。ps:可以百度一下重载


函数就像申明一个变量,当具有相同名字时就会和变量一样后者覆盖前者。


lunaticf.cn


以Java的方法和JS的函数来比较一下:

所以,JS中的函数虽然也叫函数,但是别忘了它本质上还是一种对象,只不过是一种比较特殊的具有可调用特征的对象罢了。

JS中的函数跟很多其他语言中的函数或方法不可同日而语。

当然,JS完全可以设计成支持重载,但是为什么不支持呢?我觉得,可能跟JS一开始的目标就是要设计成一种简单的、动态类型的语言有关。增加了重载,就没那么简单了,而且参数还不能动态传递了。

【热门文章】
【热门文章】