美文网首页
2020-05-12 JS实现add(1)(2)(3)(4)的调

2020-05-12 JS实现add(1)(2)(3)(4)的调

作者: 流泪手心_521 | 来源:发表于2020-05-12 16:20 被阅读0次

1.第一种

var add = function (m) {
 
    var temp = function (n) {
        return add(m + n);
    }
 
    temp.toString = function () {
        return m;
    }
 
    return temp;
};
 
 
add(3)(4)(5); // 12
add(3)(6)(9)(25); // 43

这个add函数可以无限次调用循环调用,并且把所有传进去的值相加,最后返回相加总数。这道题咋一看有点特别,但代码量极其少而精,重点技术在于:作用域、交替、匿名函数、toString的巧妙。
让我们来解释这个过程:add(3)(4)(5)
1、先执行add(3),此时m=3,并且返回temp函数;
2、执行temp(4),这个函数内执行add(m+n),n是此次传进来的数值4,m值还是上一步中的3,所以add(m+n)=add(3+4)=add(7),此时m=7,并且返回temp函数
3、执行temp(5),这个函数内执行add(m+n),n是此次传进来的数值5,m值还是上一步中的7,所以add(m+n)=add(7+5)=add(12),此时m=12,并且返回temp函数
4、关键性一步来了,后面没有传入参数,等于返回的temp函数不被执行而是打印,了解JS的朋友都知道对象的toString是修改对象转换字符串的方法,因此代码中temp函数的toString函数return m值,而m值是最后一步执行函数时的值m=12,所以返回值是12。
看到这其实就很明白了,代码中temp.toString的重写只是为了函数不执行时能够返回最后运算的结果值,所以这个地方是可以任意修改的,你让它返回什么它就返回什么,比如改写:

temp.toString = function () {
return “total : ” + m;
}

执行结果:

>>> add(3)(4)(5);
total : 12

2.第二种


function add(x) {
var sum = x;
var tmp = function (y) {
sum = sum + y;
return tmp;
};
tmp.toString = function () {
return sum;
};
return tmp;
}
console.log(add(1)(2)(3)); //6
console.log(add(1)(2)(3)(4)); //10

首先要一个数记住每次的计算值,所以使用了闭包,在tmp中记住了x的值,第一次调用add(),初始化了tmp,并将x保存在tmp的作用链中,然后返回tmp保证了第二次调用的是tmp函数,后面的计算都是在调用tmp, 因为tmp也是返回的自己,保证了第二次之后的调用也是调用tmp,而在tmp中将传入的参数与保存在作用链中x相加并付给sum,这样就保证了计算;

但是在计算完成后还是返回了tmp这个函数,这样就获取不到计算的结果了,我们需要的结果是一个计算的数字那么怎么办呢,首先要知道JavaScript中,打印和相加计算,会分别调用toString或valueOf函数,所以我们重写tmp的toString和valueOf方法,返回sum的值。

相关文章

  • 2020-05-12 JS实现add(1)(2)(3)(4)的调

    1.第一种 这个add函数可以无限次调用循环调用,并且把所有传进去的值相加,最后返回相加总数。这道题咋一看有点特别...

  • 字节一个面试题

    实现 如下效果add(2,3,4).sumOf()add(2)(3,4).sumOf() // 9add(2)(3...

  • How To Create a Page

    Step 1) Add HTML: Step 2) Add CSS: Step 3) Add JS:

  • 2021-06-24

    1、// 用js 实现一个无限极累加的函数, 形如: add(1) //=> 1;add(1)(2) //=> 2...

  • 异步编程之Promise(一)

    1、Js中常见的异步编程方式? 1)回调函数实现2)发布订阅、通知3)事件监听4)Promise/A+ 和 生成器...

  • JS实现add(1)(2)(3)(4)的调用方式

    1.第一种 这个add函数可以无限次调用循环调用,并且把所有传进去的值相加,最后返回相加总数。这道题咋一看有点特别...

  • 07-26 js习题

    1.打平嵌套数组 [1, [2, [3], 4], 5] => [1, 2, 3, 4, 5] 2.用js实现随机...

  • Js实现add(1)(2)

    源于Codewar上的一道题 首先要一个数记住每次的计算值,所以使用了闭包,在tmp中记住了n的值,第一次调用ad...

  • js中的valueOf和toString的隐式调用

    柯里化函数 实现一个函数:add(1,2)(3) -> 6add(1)(2)(3) -> 6add(1)(2)(...

  • 8.11练习

    1.打平嵌套数组 [1, [2, [3], 4], 5] => [1, 2, 3, 4, 5]2.用js实现随机选...

网友评论

      本文标题:2020-05-12 JS实现add(1)(2)(3)(4)的调

      本文链接:https://www.haomeiwen.com/subject/ltabnhtx.html