跳至主要內容

函数重载

Cap原创大约 1 分钟javascript js

javaScript并没有函数重载的概念,所谓重载就是一些函数具有相同的函数名,但是参数不同,也能进行正确的运算。

function addNum(num1) {
  return num1 + 100
}
function addNum(num1,num2) {
  return num1 + 200 + num2
}

运行上述的函数,结果只会得到加200的值,对于同一函数名的函数,后者定义的会覆盖前者。

但是js可以实现重载吗?根据入参的不同执行不同的操作。
完全可以
第一种:

function addNum() {
  const a = arguments.length
	switch (a) {
    case 1:
      break;
    case 2:
      break;
  }
}

第二种:
使用了闭包的方法

function addMethod (object, name, fn) {
	let old = object[name]
  // object 的 name属性就是存放这个判断函数的地方
  object[name] = function () {
  	// 这里匿名函数会有对应的词法作用域
    if (fn.length === arguments.length) {
    	//参数相等,表示匹配到了对应的处理函数,那么就执行他
      return fn.apply(this, arguments)
    } else if (typeOf old == 'function') {
    	//参数不相等,执行原来的方法
      return old.apply(this, arguments)
    }
  }
}
let numbers = {value: 100, method: null }
// 我们执行 addMethod方法时,会在object的name属性上声明一个函数,这个函数的运行和fn有关

// 当没有参数的时候,返回对象的value值
addMethod (numbers, method, function(){
	return this.value
})
// 所以当我们运行numbers.method时,这时根据词法作用域,会去寻找fn的入参长度,
// 因为闭包的特性,我们能找到之前执行addMethod对应的fn,即function(){return this.value}这个匿名函数
numbers.method()