函数重载是什么样子的?

qzuser
  • 84

js中不是不能重载吗?

function rec(num){
    return num+1;
}

function rec(num){
    return num+2;
}

rec(2)  // 4

那么为什么?

function rec(num){
    return  num+1;
}

rec(1)    // 2
rec(2)    // 3

不是调用相同的函数名的函数,后者会覆盖前者吗?为什么第二种能顺序返回

回复
阅读 2.6k
5 个回答

你这是分开在开发工具的console里运行的吧,一起写好一同运行

函数在js中是引用数据类型,引用数据类型是存储在堆当中的,它的地址指针是存储在栈当中的,所以会覆盖掉前面的函数。

michael_cai
  • 10.6k

楼主先理解函数重载重写 即使是java里 应该也是有区别这两个概念的

java中
重载: 函数名一样 参数不一样
重写: 函数名一样 参数一样

因为js的函数参数都是不固定的 所以js里函数没有重载 只要是函数名一样 后定义的的函数会覆盖之前的函数

而且你可以吧函数认为是变量

let someFunc;

someFunc = function () {  /** TODO **/}
someFunc(); // 无参数执行函数
someFunc(1, 2, 3); // 传入参数并执行

someFunc = function () { /** TODO2 **/ }
someFunc();  // 这个执行的当然是后面那个TODO2了啊  可以认为是重写了这个函数
//通过参数个数的不同实现重载
function addMethod(obj, name, fn) {
    var ofn = obj[name];
    obj[name] = function() {
        if(fn.length === arguments.length) {
            return fn.apply(this, arguments);
        } else if(typeof ofn === 'function') {
            return ofn.apply(this, arguments);
        }
    };
}
var app = {};
addMethod(app, 'test', function(){
    console.log("未传参数");
});
addMethod(app, 'test', function(a){
    return a;
});
addMethod(app, 'test', function(a, b){
    return a + b;
});

app.test() // 未传参数
app.test(123) // 123
app.test(12,23) // 35

代码摘至-《JavaScript Ninja》-

宣传栏