函数重载
原创大约 1 分钟
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()