函数柯里化实现add(1)(2)(3)
1.初步实现
在JavaScript中,你可以通过创建一个返回函数的函数来实现这种链式调用的模式。这种模式通常被称为柯里化(Currying)的一种形式,尽管在这个例子中,我们并没有减少参数的数量,而是延迟了它们的处理。
以下是一个简单的实现方式:
function add() {
let args = Array.prototype.slice.call(arguments);
function inner() {
args.push(...arguments);
return inner;
}
inner.toString = function () {
return args.reduce(function (pre, cur) {
return pre + cur;
});
};
return inner;
}
//必须要有一个加号
console.log(+add(1)); //1
console.log(+add(1, 2)); //3
console.log(+add(1, 2)(3)); //6
console.log(+add(1)(2)(3)(4)(5)); //15
console.log(add(1)(2)(3)(4)(5)); //返回一个函数
我们可以看打印结果:

在这个例子中,add 函数返回了一个名为inner的内部函数。inner函数接受一些数字参数,将其加到 args数组,然后返回自己。因此,你可以连续调用add(1)(2)(3),每次调用都会将新的数字添加到args数组中。
需要注意的是,由于inner是一个函数,如果你直接打印add(1)(2)(3),它将输出函数本身而不是结果。为了解决这个问题,我们覆盖了inner的toString方法,使其返回数组中所有数字之和。这样,当你尝试打印add(1)(2)(3)时,实际上会调用 inner.toString(),从而得到结果。
2.完善代码
然而,上述这种覆盖 toString 的方法并不是最佳实践,因为它改变了 inner 函数的预期行为。一个更好的方法是提供一个方法来获取结果,例如:
function add() {
let args = Array.prototype.slice.call(arguments);
function inner() {
args.push(...arguments);
return inner;
}
inner.getResult = function () {
return args.reduce(function (pre, cur) {
return pre + cur;
});
};
return inner;
}
let result = add(1, 2, 3, 4, 5);
console.log(result.getResult()); // 输出 15
在这个版本中,我们添加了一个 getResult 方法来获取结果,而不是覆盖 toString。这样,inner函数的行为就更加清晰和可预测了。

419

被折叠的 条评论
为什么被折叠?



