BFE.devAI解答 - JavaScript 代码题
23. 实现一个sum()方法
实现如下:
function sum(num) { let result = num; // 初始值为第一次调用传入的参数 const fn = function(num2) { result += num2; // 将每次调用的参数加到result中 return fn; } fn.valueOf = function() { // 重写valueOf方法,返回sum的结果 return result; }; return fn;}
以上实现中,使用了函数柯里化的思想,每次调用返回一个新的函数,将结果累加到闭包变量result
中,并重写valueOf
方法,最后返回这个新函数。当我们对这个函数进行计算或打印时,会自动调用重写的valueOf
方法,返回累加的结果。
其他的一些解答思路:
使用闭包:
function sum(a) { function inner(b) { return sum(a + b); } inner.valueOf = inner.toString = () => a; return inner;}
使用 ES6 箭头函数:
const sum = a => { const _sum = b => sum(a + b); _sum.valueOf = () => a; return _sum;};
使用代理对象:
function Builder(fn, args) { const self = this; this.fn = fn; this.args = args || []; return new Proxy(fn, { get(target, name) { if (name !== "valueOf") { return self; } return () => self.args.reduce((a, b) => a + b, 0); }, apply(target, thisArg, args) { return new Builder(target, self.args.concat(args)); } });}const sum = num => new Builder(null, [num]);