函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数、类型、顺序)的函数,这组函数被称为重载函数。重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。

但是在 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

完,如有不恰当之处,欢迎指正哦。

从两个角度理解为什么 JS 中没有函数重载的更多相关文章

  1. 从极大似然估计的角度理解深度学习中loss函数

    从极大似然估计的角度理解深度学习中loss函数 为了理解这一概念,首先回顾下最大似然估计的概念: 最大似然估计常用于利用已知的样本结果,反推最有可能导致这一结果产生的参数值,往往模型结果已经确定,用于 ...

  2. js中的函数重载

    函数重载与js 什么是函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,也就是说用 ...

  3. 从源码的角度看 React JS 中批量更新 State 的策略(下)

    这篇文章我们继续从源码的角度学习 React JS 中的批量更新 State 的策略,供我们继续深入学习研究 React 之用. 前置文章列表 深入理解 React JS 中的 setState 从源 ...

  4. 从源码的角度看 React JS 中批量更新 State 的策略(上)

    在之前的文章「深入理解 React JS 中的 setState」与 「从源码的角度再看 React JS 中的 setState」 中,我们分别看到了 React JS 中 setState 的异步 ...

  5. 深入理解Node.js中的垃圾回收和内存泄漏的捕获

    深入理解Node.js中的垃圾回收和内存泄漏的捕获 文章来自:http://wwsun.github.io/posts/understanding-nodejs-gc.html Jan 5, 2016 ...

  6. 深入理解three.js中光源

    前言: Three.js 是一个封装了 WebGL 接口的非常好的库,简化了 WebGL 很多细节,降低了学习成本,是当前前端开发者完成3D绘图的得力工具,那么今天我就给大家详细讲解下 Three.j ...

  7. 深入理解Three.js中透视投影照相机PerspectiveCamera

    前言 在开始正式讲解透视摄像机前,我们先来理理three.js建模的流程.我们在开始创建一个模型的时候,首先需要创建我们模型需要的物体,这个物体可以是three.js中已经为我们封装好的,比如正方体, ...

  8. node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了

    最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...

  9. 深入理解Three.js中正交摄像机OrthographicCamera

    前言 在深入理解Three.js中透视投影照相机PerspectiveCamera那篇文章中讲解了透视投影摄像机的工作原理以及对应一些参数的解答,那篇文章中也说了会单独讲解Three.js中另一种常用 ...

随机推荐

  1. [wikipedia] List of free and open-source software packages

    List of free and open-source software packages From Wikipedia, the free encyclopedia     This articl ...

  2. Java中Map/List/Set .

    很实用,分享一下. 简单版本 复杂版本 参考: http://initbinder.com/articles/cheat-sheet-for-selecting-maplistset-in-java. ...

  3. Open Source Software List: The Ultimate List

    http://www.datamation.com/open-source/ Accessibility 1. The Accessibility Project The Business Value ...

  4. H3C 常用接口和线缆

  5. 【JQ】toggle / slideToggle / fadeToggle 的区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. LRJ

    //3-1 #define _CRT_SECURE_NO_WARNINGS #include <cstdio> int main() { int T; ]; scanf("%d& ...

  7. 2019-9-9-dotnet-获取本机-IP-地址方法

    title author date CreateTime categories dotnet 获取本机 IP 地址方法 lindexi 2019-09-09 15:56:33 +0800 2019-0 ...

  8. 【u128】又一个数字游戏

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小明拿出了一个素数集合,{2, 3, 5, 7, 11, 13, -, 127, -},他发现,从小到 ...

  9. [转]【转】大型高性能ASP.NET系统架构设计

    大型高性能ASP.NET系统架构设计 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳 ...

  10. [转]分布式监控工具Ganglia 介绍 与 集群部署.

    如果你目的很明确就是冲着标题来的,不爱看我唠叨,请直接进入第二个分割线之后的内容. 其实之前就是有做Swift监控平台的打算的,但是因为没什么硬性需求么,也不要紧的,就一直搁置了.最近实验室来了个大二 ...