JavaScript Arguments与实现函数重载

2017-04-05  本文已影响0人  tazbingor

可以用函数内置的argument模拟函数重载

什么是arguments ?

arguments 是一个类似数组的对象, 对应于传递给函数的参数。
属性

1.arguments.length

返回当前函数的参数数量

function myMultiplication() { 
    console.log(arguments.length);//2
    return arguments[0] * arguments[1] 
}
console.log(myMultiplication.call(null,6,6));

2.arguments.callee

返回一个对函数的引用,该函数调用了当前函数 ECMAScript (ES5) 禁止使用 arguments.callee()

具体实现

1.根据参数个数重载

function myMath() {
  if (arguments.length === 2) {
    return arguments[0] + arguments[1]
  } else if (arguments.length === 3) {
    return arguments[0] + arguments[1] + arguments[2]
  }else {
    return 0;
  }
}  
console.log(myMath(1,1));//2
console.log(myMath(1,1,1));//3

2.限制函数参数类型重载

function myMathAdd() {
    // console.log(arguments.length)
    if (arguments.length === 0) { return 0; }
    var res = 0
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i].constructor === Number) {//判断参数类型
            res = res + arguments[i];
        }
    }
    // console.log(res);
    return res;
}
console.log(myMathAdd.call(myMathAdd, 1, 2, 3))//6
console.log(myMathAdd.call(myMathAdd, 6, 6))//12

JS不需要函数重载

函数重载是java,C#,C等强类型语言的使用者的习惯,在现阶段看来,无非是多写几个字多取几个函数名的而已,况且在JS中,相同函数名会导致后者覆盖前者.

function testOverload(){
    return arguments[0] + arguments[1]; 
}

function testOverload(){
    return arguments[0] + arguments[1] + arguments[2]; 
}
console.log(testOverload.call(null,1,1));//NaN
console.log(testOverload.call(null,1,1,1));//3

上述的例子已经很明显了,反映JS函数的一个特性,虽然JS的函数也叫函数,但JS的函数和其他强类型语言(如Java)的函数还是有区别的,在java中是通过方法名、参数类型、参数数量、参数顺序这四个方面(方法签名)来确定一个函数。而JS只通过函数名来确定函数,并且JS的函数对象函数名是普通变量。上述的testOverload()相当于绑定了两个函数对象,从结果得知,后者必然覆盖前者,并不会同时存在,所以函数重载也就没有必要了。
其实多写几个字也不累。

参考
<li><a>https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments

上一篇下一篇

猜你喜欢

热点阅读