JavaScript函数重载(js函数重载)

一个猜测

猜测

Java中的方法(函数)重载:类里面的两个或多个重名的方法,方法的参数个数、类型至少有一个不一样,构成了方法重载。

由于js参数类型都为var,我们由此提出大胆猜测:js函数重载只能通过形参的个数不同来区分。

验证

来操作一波:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>js函数重载</title>
</head>
<body><script type="text/javascript">function add(){document.writeln("没有参数,你让我加什么?")}function add(a,b){return a+b;}function add(a,b,c) {return a+b+c;}document.writeln(add());document.writeln(add(1,2));document.writeln(add(2,3,4));</script>
</body>
</html>


咦呀!年轻人不讲武德,来骗,来否定我69岁的老猜测。

再尝试

这个输出结果看的我一脸懵,没事,再来尝试一下别的:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>js函数重载</title>
</head>
<body><script type="text/javascript">function comeon() {document.writeln("无参一身轻");document.write("<br>");}function comeon(i) {document.writeln("一参是为"+i);document.write("<br>");}function comeon(i,j){document.writeln("二参数更有"+i+"和"+j);document.write("<br>");}comeon();comeon(1);comeon(1,2);</script>
</body>
</html>

再看下面这段:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>js函数重载</title>
</head>
<body><script type="text/javascript">function comeon() {document.writeln("无参一身轻");document.write("<br>");}function comeon(i) {document.writeln("一参是为"+i);document.write("<br>");}comeon();comeon(1);</script>
</body>
</html>


再看:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>js函数重载</title>
</head>
<body><script type="text/javascript">function comeon() {document.writeln("无参一身轻");document.write("<br>");}comeon();</script>
</body>
</html>

看来,几个同名函数,每次调用,都只会调用参数最多的那个函数。才会出现上面那些奇怪的输出。

等等,真是这样吗?那你就错了,请看如下代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>js函数重载</title>
</head>
<body><script type="text/javascript">function comeon() {document.writeln("无参一身轻");document.write("<br>");}function comeon(i,j){document.writeln("二参数更有"+i+"和"+j);document.write("<br>");}function comeon(i) {document.writeln("一参是为"+i);document.write("<br>");}comeon();comeon(1);comeon(1,2);</script>
</body>
</html>


再看:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>js函数重载</title>
</head>
<body><script type="text/javascript">function comeon(i,j){document.writeln("二参数更有"+i+"和"+j);document.write("<br>");}function comeon(i) {document.writeln("一参是为"+i);document.write("<br>");}function comeon() {document.writeln("无参一身轻");document.write("<br>");}comeon();comeon(1);comeon(1,2);</script>
</body>
</html>


恍然大悟,原来,对于同名函数,在调用时,js只会调用最后定义的那个函数,这哪里是重载啊,这分明就是“覆盖”啊!前面的定义被后面的定义覆盖了。

结论

猜测不成立,当js函数重名函数形参个数不同时,实际上,后面的定义会覆盖前面的,相当于,所谓重名函数,实际上是一个函数被定义了好几遍,最后一次定义才是最终定义,调用时会调用最后一次定义的函数。

实际上,js不存在重载。

模拟重载

​ 虽然我们刚刚的猜想被否定了,但对于本文的第一段代码,能不能对其做一些修改,来达到重载的效果呢?也就是模拟重载。我们自然而然想到,我们能不能够获取函数调用时实参的个数,然后用一个无形参的函数实现与猜想中重载相同的效果呢?

​ 那么,无参函数可以接收调用时给的实际参数吗?听起来有点荒谬,没想到还真可以,js的arguments对象可以接收函数调用时的实参,因此,实参多于形参,甚至没有形参时,程序都不会报错,反正你给多少实参我都收着,来者不拒,来一个在我这儿是arguments[0],来第二个是arguments[1],依次类推。arguments对象的length属性,可以获取函数的实参个数。

接下来就好办了:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>js模拟重载</title>
</head>
<body><script type="text/javascript">//arguments对象可接收实参,arguments对象的length属性可获取实参个数。function add(){if(arguments.length==0){document.writeln("没有参数,你让我加什么?");document.write("<br>");}else if(arguments.length==1){document.writeln(arguments[0]);document.write("<br>");}else{var n = 0;len = arguments.length;for (var i = 0; i < len; i++) {n+=arguments[i];}document.writeln(n);document.write("<br>");}}add();add(1);add(1,2);add(1,2,3);</script>
</body>
</html>

结论

js中实际上不存在重载,但是我们根据Java重载的思路,实现了对求和函数的模拟重载。Java重载的作用是:减少函数名的数量,避免了名字空间的污染,减少代码行数,提高代码可读性。因此我们在对js进行模拟重载时,也应该考虑这些因素,并非为了模拟重载而模拟重载。

JavaScript函数重载(js函数重载)相关推荐

  1. 【JS函数】JS函数之高阶函数、组合函数、函数柯里化

    自我介绍:大家好,我是吉帅振的网络日志:微信公众号:吉帅振的网络日志:前端开发工程师,工作4年,去过上海.北京,经历创业公司,进过大厂,现在郑州敲代码. JS函数专栏 1[JS函数]JS函数之普通.构 ...

  2. 菜鸟教程-Javascript学习笔记-JS函数之前

    教程连接是: https://www.runoob.com/js/js-tutorial.html DOM(一些操作页面元素的方法) BOM(一些操作浏览器的方法) ################# ...

  3. C#代码调用js函数,js函数中的document.getElementById(对象ID)得null值解决办法

    不知道大家有没有遇到这种情况,反正我就遇到过,我现在把解决方法写在下面. 解决方法:1,把调用js函数些在</from>下面.(我原来是写在head标签里面) 2,在cs页面定义一个全局变 ...

  4. 高阶函数、js函数内返回一个内部函数详解---->函数柯里化

    高阶函数 如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数. 若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数. 若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函 ...

  5. JavaScript学习记录 (三) 函数和对象

    1.函数 使用 function 关键字来声明函数 函数的命名规则和变量一样 JS没有函数签名,所以没有函数重载 JS函数中的所有参数都是值传递:不能通过引用传递 // 定义函数 function t ...

  6. JS函数重载解决方案

    JS的函数定义可以指定形式参数名称,多多少少我们会以为js至少可以支持参数个数不同的方法重载,然而遗憾的是这仅仅是一个假象,js所有的参数都是以arguments传递过去的,这个参数类似于数组,在函数 ...

  7. Javascript(二)——函数(重载、回调)与作用域(附图解)

    文章目录 一.函数 1.1函数的本质 1.2创建函数 1) 声明方式 function 2) 赋值方式 3)new创建--几乎不用 4)ES5-create()方法 1.2 递归 1.3 重载函数 1 ...

  8. 浅谈细说 JS 函数(call,apply,重载)

    什么是函数? 引用 W3School 的原话:函数是一组可以随时随地运行的语句. 函数是 ECMAScript 的核心. 函数是由这样的方式进行声明的:关键字 function.函数名.一组参数,以及 ...

  9. js基础--javascript基础概念之函数

    js基础--javascript基础概念之函数 引用w3c介绍: 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用 ...

  10. C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)

    每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...

最新文章

  1. java链接mysql mvc_MVC jsp+servlet+javabean 连接Mysql数据库測试demo
  2. Golang-简洁的并发
  3. Nodejs介绍及其安装
  4. 计算机导论sql试题,sql语句查询 练习题
  5. schoolcms - 学习笔记
  6. ORACLE SQL获取时间字段
  7. android的app语言无法切换,Android应用实现多语言切换
  8. C语言 int y=10 do,删除学生信息算法执行完case10输入y 之后do whil
  9. 模拟——生活大爆炸版石头剪刀布(洛谷 P1328)
  10. pvr转png工具_图片如何转换格式?最好用的3个转换工具都在这了
  11. Python学习Day14
  12. 三菱梯形图转换c语言软件,三菱PLC编程软件的梯形图程序的生成与编辑
  13. 模电试题_数电试题 综合测试
  14. 基于51单片机GPS定位系统经纬度GSM无线传输系统
  15. 跳槽拿到最高月薪20K 我成为月薪20K的软件测试工程师是一种什么样的体验?
  16. 学车考试技巧(图解)
  17. Spring Boot 2.0.6 整合 Spring Clod Bus + Kafka
  18. k8s.gcr.io、gcr.io仓库的镜像下载
  19. python语言 表白程序_python程序员实现表白代码的案例
  20. 区块链是什么?简单理解区块链

热门文章

  1. MySQL客户端安装
  2. 本地yum源安装teamviewer
  3. MYSQL 数据库配置优化
  4. 学习C语言,有哪些值得推荐的经典书籍?
  5. 超详细的Engauge Digitizer 软件教程
  6. 第五版fmea表格_FMEA第五版: 新版 DFMEA六步法解析
  7. 书籍推荐《区块链技术指南》
  8. Apache OpenOffice-java调用时的问题总结
  9. 【数据集】Python爬取某国内所有航班记录
  10. 开发基于MFC的应用程序