我的回答

js中不存在函数重载, 我们可以通过函数的argument参数和高阶函数两者配合实现重载

  1. function showSum() {
  2. //使用arguments对象模拟出重载效果
  3. if (arguments.length == 1)
  4. {
  5. alert(arguments[0] + 1);
  6. }
  7. else if (arguments.length == 2)
  8. {
  9. alert(arguments[0] + arguments[1]);
  10. }
  11. else if (arguments.length == 3)
  12. {
  13. alert(arguments[0] + arguments[1] + arguments[2]);
  14. }
  15. else {
  16. alert('请传入参数!');
  17. }
  18. }
  19. //显示101
  20. showSum(100);
  21. //显示200
  22. showSum(100, 100);
  23. //显示300
  24. showSum(100, 100,100);

参考回答

背景知识

JavaScript 不支持重载的语法,它没有重载所需要的函数签名。ECMAScript 函数不能像传统意义上那样实现重载。而在其他语言(如 Java)中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。如前所述,ECMAScript 函数没有签名,因为其参数是有包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。

函数重载

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

模拟实现

  • 借助流程控制语句

通过判断传入参数的个数,执行相对应的代码块

  1. function toDo(){
  2. switch(arguments.length){
  3. case 0:
  4. /* 代码块0 */
  5. break;
  6. ...
  7. case n:
  8. /* 代码块n */
  9. break;
  10. }
  11. }
  • 利用闭包特性 addMethod 函数接收 3 个函数:目标对象、目标方法名、函数体,当函数被调用时:
    1. 先将目标object[name]的值存入变量old中,因此起初old中的值可能不是一个函数;
    1. 接着向object[name]赋值一个代理函数,并且由于变量old、fnt在代理函数中被引用,所以old、fnt将常驻内存不被回收
      1. function addMethod(object, name, fnt) {
      2. var old = object[name]; // 保存前一个值,以便后续调用
      3. object[name] = function () {
      4. // 向object[name]赋值一个代理函数
      5. // 判断fnt期望接收的参数与传入参数个数是否一致
      6. if (fnt.length === arguments.length)
      7. // 若是,则调用fnt
      8. return fnt.apply(this, arguments);
      9. else if (typeof old === "function")
      10. // 若否,则判断old的值是否为函数
      11. // 若是,则调用old
      12. return old.apply(this, arguments);
      13. };
      14. }
      15. //模拟重载add
      16. var methods = {};
      17. //添加方法,顺序无关
      18. addMethod(methods, "add", function () {
      19. return 0;
      20. });
      21. addMethod(methods, "add", function (a, b) {
      22. return a + b;
      23. });
      24. addMethod(methods, "add", function (a, b, c) {
      25. return a + b + c;
      26. });
      27. //执行
      28. console.log(methods.add()); //0
      29. console.log(methods.add(10, 20)); //30
      30. console.log(methods.add(10, 20, 30)); //60