我的回答
js中不存在函数重载, 我们可以通过函数的argument参数和高阶函数两者配合实现重载
function showSum() {//使用arguments对象模拟出重载效果if (arguments.length == 1){alert(arguments[0] + 1);}else if (arguments.length == 2){alert(arguments[0] + arguments[1]);}else if (arguments.length == 3){alert(arguments[0] + arguments[1] + arguments[2]);}else {alert('请传入参数!');}}//显示101showSum(100);//显示200showSum(100, 100);//显示300showSum(100, 100,100);
参考回答
背景知识
JavaScript 不支持重载的语法,它没有重载所需要的函数签名。ECMAScript 函数不能像传统意义上那样实现重载。而在其他语言(如 Java)中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。如前所述,ECMAScript 函数没有签名,因为其参数是有包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。
函数重载
重载函数是函数的一种特殊情况,为方便使用,允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数,类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能 —- 重载函数
模拟实现
- 借助流程控制语句
 
通过判断传入参数的个数,执行相对应的代码块
function toDo(){switch(arguments.length){case 0:/* 代码块0 */break;...case n:/* 代码块n */break;}}
- 利用闭包特性 addMethod 函数接收 3 个函数:目标对象、目标方法名、函数体,当函数被调用时:
 - 先将目标object[name]的值存入变量old中,因此起初old中的值可能不是一个函数;
 
- 接着向object[name]赋值一个代理函数,并且由于变量old、fnt在代理函数中被引用,所以old、fnt将常驻内存不被回收
function addMethod(object, name, fnt) {var old = object[name]; // 保存前一个值,以便后续调用object[name] = function () {// 向object[name]赋值一个代理函数// 判断fnt期望接收的参数与传入参数个数是否一致if (fnt.length === arguments.length)// 若是,则调用fntreturn fnt.apply(this, arguments);else if (typeof old === "function")// 若否,则判断old的值是否为函数// 若是,则调用oldreturn old.apply(this, arguments);};}//模拟重载addvar methods = {};//添加方法,顺序无关addMethod(methods, "add", function () {return 0;});addMethod(methods, "add", function (a, b) {return a + b;});addMethod(methods, "add", function (a, b, c) {return a + b + c;});//执行console.log(methods.add()); //0console.log(methods.add(10, 20)); //30console.log(methods.add(10, 20, 30)); //60
 
- 接着向object[name]赋值一个代理函数,并且由于变量old、fnt在代理函数中被引用,所以old、fnt将常驻内存不被回收
 
