add(2)(3)(4) 输出9

目录

1、add(2)(3)(4)   // 输出9

2、考虑其拓展性

3、两种方法

第1种方法:

第2种方法:

4、最终实现 


1、add(2)(3)(4)   // 输出9

以下方法可实现,但是拓展性差

function add(num) {
    var sum = 0
    sum = sum + num
    return function(numB) {
        sum = sum + numB
        return function(numC) {
            sum = sum + numC
            return sum
        }
    }
}

console.log(add(2)(3)(4)) // 9

2、考虑其拓展性

可以发现返回的每一个函数执行的逻辑都是一样的,就此我们可以精简下代码。

让函数返回后返回自身,这就是链式调用的写法,add(2)(3)(4)就是一个链式调用

function add(num) {
    var sum = 0
    sum = sum + num
    return function tempFun(numB) {
        sum = sum + numB
        return tempFun
    }
}
var result = add(2)(3)(4)(5);
console.log(result);

打印结果: 
    ƒ tempFun(numB) {
        sum = sum + numB
        return tempFun
    }

但是,并没有输出我们预料的结果14,而是一个函数的字符串表示。

想想也不奇怪,你每次函数调用后返回的一个函数对象,那么console.log输出就是一个函数对象的字符串表示了。那么怎么能把结果输出呢?


3、两种方法

第1种方法:

在函数中添加判断,当没有输入参数时,直接返回调用的结果而不是返回函数。

function add(num) {
    var sum = 0
    sum = sum + num
    return function tempFun(numB) {
        if (arguments.length === 0) {
            return sum
        } else {
            sum = sum + numB
            return tempFun
        }
    }
}

调用时和前面的有点区别:

var result = add(2)(3)(4)(5)();
console.log(result); // 输出14

第2种方法:

利用JS中对象到原始值的转换规则。

当一个对象转换成原始值时,先查看对象是否有valueOf方法,如果有并且返回值是一个原始值,那么直接返回这个值。

否则没有valueOf或返回的不是原始值,那么调用toString方法,返回字符串表示

我们就为函数对象添加一个valueOf 方法和 toString方法

function add(num) {
    var sum = 0
    sum = sum + num
    var tempFun = function(numB) {
        if (arguments.length === 0) {
            return sum
        } else {
            sum = sum + numB
            return tempFun
        }
    }

    tempFun.valueOf = function() {
        return sum
    }
    tempFun.toString = function() {
        return sum + ''
    }
    return tempFun
}
let result = add(2)(3)(4)(5)
console.log(+result) // 14  => valueOf
console.log(result) // 14 => toString

个人认为这样的写法很不好~函数调用语义不清晰

PS:还可以这样实现

var add=(function(){
    var args=[];
    function addInner(){
        if(arguments.length===0){
            return calResult;
        }else{
            Array.prototype.push.apply(args,Array.prototype.splice.call(arguments,0));
            return add;
        }

    }
    function calResult(){
        var result=args.reduce(function(previousValue, currentValue){
            return previousValue+currentValue;
        },0);
        args=[];
        return result;
    }
    addInner.valueOf=function(){
        return calResult();
    };

    addInner.toString=function(){
        return calResult()+'';
    };

    return addInner;
}());


console.log('%d',add(1)(2)(3)(4));

4、最终实现 

function add(x) {
    var sum = x
    var tempFun = function(y) {
        sum = sum + y
        return tempFun
    }

    tempFun.toString = function() {
        return sum
    }
    return tempFun
}


console.log(add(2)(3)(4)(5)) // 14
console.log(add(2)(3)(4)) // 9

5、实现:

add(1)(2)(3) = 6

add(1,2,3)(4) = 10

add(1)(2)(3)(4)(5) = 15

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值