本文探讨如何在JavaScript中实现一个支持无限参数调用的累加函数。通过三种不同思路:利用arguments.callee修改toString、固定层级嵌套返回、以及重写valueOf与toString属性,分别展示了闭包、柯里化及类型转换在函数式编程中的应用,帮助开发者深入理解函数执行与对象转换机制。
题目描述与需求分析
题目要求补全函数 add(x) 的代码,使得调用 alert(add(2)(3)(4)) 时输出结果为 9。
解法一:利用arguments.callee与闭包
第一种解法思路如下:
具体实现代码如下:
//作者:貘大
function add(x) {
var c = 0;
return function(x) {
c = c + x ; arguments.callee.toString = function(){
return c;
};
return arguments.callee;
}(x);
};
alert(add(2)(3)(4)); 解法二:固定层级嵌套返回
第二种解法思路如下:
具体实现代码如下:
//作者:三桂
function add(x) {
return function(y){
return function(z){
return x+y+z;
}
}
};
alert(add(2)(3)(4)); 解法三:重写valueOf与toString属性
第三种解法思路如下:
具体实现代码如下:
//作者:司徒正美
function add (a){
if(!isFinite(add.i)){
add.i = a
}else {
add.i += a;
}
add.valueOf = add.toString = function(){
return add.i
}
return add;
}
alert(add(2)(3)(4)) 上述题目主要考察的是柯里化(curry)技术,详细原理可参考相关博客文章。
如果您有其他更优的解法,欢迎交流指正。