1. function add(m) {
    2. var tmp = function (n) {
    3. return add(m+n);
    4. };
    5. tmp.toString = function () {
    6. return m;
    7. };
    8. return tmp;
    9. }
    10. console.log(add(1)(2));

    看到这段代码,你可能看了网上的文章,或者面试题
    比如这些
    https://blog.csdn.net/m0_37922443/article/details/114096887
    https://www.jianshu.com/p/2b4c2a0cc2ec
    这个面试题

    curry(柯里化) 函数

    1. add(1)(2); // 结果为3
    2. add(1)(3)(5); // 结果为9
    3. add(1)...(n); // 结果为sum

    面试官想要的答案:

    1. const add = (arg1) => {
    2. let args = [arg1];
    3. const fn = (arg2) => {
    4. args.push(arg2);
    5. return fn;
    6. };
    7. // 因为最后一次执行完毕后会返回 fn 函数体,相当于调用了 fn 的 toString 方法,所以改写 toString 方法求和即可
    8. fn.toString = function () {
    9. return args.reduce((prev, item) => prev + item, 0);
    10. };
    11. return fn;
    12. };
    13. add(1)(2)(3); // 6

    你在浏览器和node中跑一下,结果是不对的。

    会认为为执行后,会在控制台输出3,其实不然
    image.png
    它仍然会输出,函数本身,并非网上文章写的那样,调用toString方法,输出3这个结果
    node(v14.19.0)中,也是如此:
    image.png
    node输出,也不是3这个结果~

    目前alert输出时,还是会调用重写的toString方法

    所以不要迷信面试题,工作中,遇到问题,搜索引擎(谷歌、必应)查询到后,一定要自己试验一下。