问题:很难理解函数名是函数对象的指针
function addSomeNumber(num){
return num+100;
}
function addSomeNuber(num){
return num+200;
}
var result=addSomeNumber(100);//控制台输出的结果:300
感受:知道后写的同名函数覆盖了先写的同名函数,自己已经测试了结果,知道没有重载,但是就没法真正理解,只是接受了这个概念没有融化为自己的。
问题:很难理解函数名是函数对象的指针
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;
}
}
对比一下不就知道了!
function addSomeNum(num){
return num +100;
}
function addSomeNum(num){
return num +200;
}
addSomeNum(100)的结果:300. 答案无可厚非.
然后看下面的代码:
var addSomeNumber = function(num){
return num+100;
}
addSomeNumber = function(num){
return num+200;
}
addSomeNum(100)的结果:300.
对比一下你会发现,在创建第二个函数时,覆盖了引用第一个函数的变量addSomeNum.
呃 应该就理解了.
6 回答5.2k 阅读✓ 已解决
9 回答9.5k 阅读
5 回答3.7k 阅读✓ 已解决
4 回答8.1k 阅读✓ 已解决
7 回答10.1k 阅读
5 回答8.3k 阅读
2 回答10.4k 阅读✓ 已解决
以Java的方法和JS的函数来比较一下:
Java中:通过方法签名来唯一确定一个方法。所谓方法签名包括:方法名、参数类型和参数顺序、参数个数这几个要素。所以,如果两个方法名称相同,但是只要其他要素(例如参数类型、参数个数)不同,编译器就会认为是不同方法。从而可以存在同名的不同方法,导致了重载现象。
JavaScript:函数(或对象方法)完全靠函数名称唯一确定,JS不将参数列表作为区分函数的依据。更关键的是,在JS中,函数是作为一种特殊对象类型存在的,函数的名字只是一个普通的变量,本质与
var a = 1
中的变量a
没什么区别。所以如果你先后定义了两个同名函数,实际上相当于先后将两个函数对象绑定到了同一个变量上,所以后者必然覆盖前者,不会共存,也自然不存在重载了。所以,JS中的函数虽然也叫函数,但是别忘了它本质上还是一种对象,只不过是一种比较特殊的具有可调用特征的对象罢了。
JS中的函数跟很多其他语言中的函数或方法不可同日而语。
当然,JS完全可以设计成支持重载,但是为什么不支持呢?我觉得,可能跟JS一开始的目标就是要设计成一种简单的、动态类型的语言有关。增加了重载,就没那么简单了,而且参数还不能动态传递了。