从两个角度理解为什么 JS 中没有函数重载
2020-01-06 11:38
1491 查看
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数、类型、顺序)的函数,这组函数被称为重载函数。重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
但是在 JS 如果不通过一些方法是无法实现重载的,可以从以下两个角度去理解。
1. 方法签名
方法签名指的是函数的名称加形参列表,并且通过函数的名称或者形参列表都可以区分出是不同的函数。
JS 中通过形参是没有办法区分出不同的函数的,只能通过函数的名称区分出不同的函数,现在我们来看一下下面的例子.
function add(a, b) { return a + b; } function add(a, b) { return a + b + 1; }
上述实际上是一个函数,后面的函数 add 会覆盖前面的函数,究其原因还是因为 JS 是弱类型的语言,a 和 b 实际上都是用 var 声明的,等价于
function add(var a, var b) { return a + b; }
所以在 JS 中只能通过函数名称来辨别是不是同一个函数,形参是没有用的。
但是在强类型的语言中就是可以的,例如在 c 语言中,定义函数时形参必须要指定类型,向里面传值的时候也必须传递指定类型的值。函数名相同,形参名不同的函数也会被认为是不同的函数。
#include <stdio.h> int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b + 1; } int main() { printf("第一种声明函数结果 add(1, 3)= %d \n", add(1, 3)); printf("第二种声明函数结果 add(1.0, 3.0)= %lf \n", add(1.0, 3.0)); }
上述两个函数是不同的,可以打印一下结果验证一下。
所以,在 C 语言这种强类型的语言中是可以实现函数重载的,JS 这种弱类型的语言是不可以的。
2. 函数指针
另一中理解的角度是可以将函数名想象为指针,函数名中存放的是函数体存放的地址。还是通过代码来说明。
function add(a, b) { return a + b; } function add(a, b) { return a + b + 1.0; }
上面的两种声明方式等价于
var add = function (a, b) { return a + b; } add = function (a, b ) { return a + b + 1.0; }
最终 add 实际上指向的是第二个函数,第一个函数被覆盖了,所以最终调用 add 时调用的也是第二个函数,并不能实现函数的重载。
console.log(add(1, 3)) // 5
完,如有不恰当之处,欢迎指正哦。
也是第二个函数,并不能实现函数的重载。
console.log(add(1, 3)) // 5
完,如有不恰当之处,欢迎指正哦。
相关文章推荐
- javascript函数篇二、深入理解为什么javascript中没有函数重载
- 为什么vue-cli创建的build文件下没有dev-server.js文件
- 世上本没有对错,看问题的角度不同,答案不同而已,我们应该学会常常用别人的角度看世界,多一分宽容,多一分理解,多一分求同存异。
- 为什么JS没有catchMyException或类似的方法
- 从Java的角度理解前端框架,nodejs,reactjs,angularjs,requirejs,seajs
- 为什么j2ee的web研发过程中,有些jsp、html页面中,没有引入某个js(如test.js),却使用了test.js的某个函数,并且系统能够正常运行??
- 最简单理解为什么servlet中doget()没有dopost()常用
- 从Java的角度理解前端框架,nodejs,reactjs,angularjs,requirejs,seajs
- 为什么javascript会有两个表示“没有”的类型呢?
- C++中为什么没有try finally的理解
- marquee滚动字幕或图片,不理解为什么用js!望赐教
- 为什么说 2017 年你必须要学习 Go 了(多核,网络,多人协作,简单非OO,没有注解,Native,垃圾收集,代码优雅),附两个评论
- 《你不知道的JavaScript》:js中为什么没有类?
- 从Java的角度理解前端框架,nodejs,reactjs,angularjs,requirejs,seajs
- 从传统服务端开发的角度来理解区块链共识算法. 为什么 pbft 是三分之二+1即2/3+1,paxos 是二分之一+1即1/2+1
- 从汇编的角度理解为什么c样式函数使用时,实参尽量使用指针传递
- 深入理解JavaScript 中为什么没有重载?
- js报错:Ajax 中onreadystatechange在ie7及以上浏览器兼容吗,为什么没有反应?求大神
- 【前端】从Java的角度理解前端框架,nodejs,reactjs,angularjs,requirejs,seajs