function add(m) {
var tmp = function (n) {
return add(m+n);
};
tmp.toString = function () {
return m;
};
return tmp;
}
console.log(add(1)(2));
看到这段代码,你可能看了网上的文章,或者面试题
比如这些
https://blog.csdn.net/m0_37922443/article/details/114096887
https://www.jianshu.com/p/2b4c2a0cc2ec
这个面试题
curry(柯里化) 函数
add(1)(2); // 结果为3
add(1)(3)(5); // 结果为9
add(1)...(n); // 结果为sum
面试官想要的答案:
const add = (arg1) => {
let args = [arg1];
const fn = (arg2) => {
args.push(arg2);
return fn;
};
// 因为最后一次执行完毕后会返回 fn 函数体,相当于调用了 fn 的 toString 方法,所以改写 toString 方法求和即可
fn.toString = function () {
return args.reduce((prev, item) => prev + item, 0);
};
return fn;
};
add(1)(2)(3); // 6
你在浏览器和node
中跑一下,结果是不对的。
会认为为执行后,会在控制台输出3
,其实不然
它仍然会输出,函数本身,并非网上文章写的那样,调用toString
方法,输出3
这个结果
在node(v14.19.0)
中,也是如此:node
输出,也不是3
这个结果~
目前alert
输出时,还是会调用重写的toString
方法
所以不要迷信面试题,工作中,遇到问题,搜索引擎(谷歌、必应)查询到后,一定要自己试验一下。