JavaScript-JavaScript重写函数让其无限相加

JavaScript-JavaScript重写函数让其无限相加

灵芸 发布于 2017-05-23 字数 246 浏览 1116 回复 8

在网上看到一个很有趣的问题,这里拿来大家一起讨论一下,看看大家有没有什么好方法,发挥JavaScript大拿的技术吧!不多说了,上题:

function add(x) {________}; 
alert(add(2)(3)(4)); //填空,使结果为9

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

灵芸 2017-10-26 8 楼

 function add(x) {
return function(y) {
return function(z) {
return x + y + z;
};
};
};
alert(add(2)(3)(4));

瑾兮 2017-10-15 7 楼

 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));

浮生未歇 2017-09-26 6 楼
function add(x) {
/*将add当做一个函数对象,判断add的i属性是否是数字,如果不是则将x赋值给add.i*/
if( !isFinite(add.i) ){
add.i = x
}else {
add.i += x;
}
add.toString = function(){
var res = add.i;
add.i = 0;
return res;
} //重构add.toString方法为返回add.i值
return add; //返回add函数对象
};
alert(add(2)(3)(4));
alert(add(2)(3)(4)(5));

            
清晨说ぺ晚安 2017-08-12 5 楼

无意中在一个博客中看到一个也非常好的实现方式,贴出来给大家分享下:

  function add(x){
var that = function(n){
n += that;
return add(n);
};
that.toString = that.valueOf=function(){return x;};
return that;
}
alert(add(2)(3)(4)(5)(6));

甜柠檬 2017-08-10 4 楼

推荐一种currying形式,意思就是将拥有多个参数的函数Currying化为拥有单一参数的函数形式。虽然不符合问题的要求,大家可以研究研究

 function add(){
var result=0;
for(var i=0, n=arguments.length; i<n; i++){
result += arguments[i];
}
return result;
};
var curry = function(fn){//原函数的参数为函数
return function(args){//内部函数的参数为数组,由于立即执行,因此直接到第三重去
var self= arguments.callee;//把自身保存起来
return function(){ //这才是第二次调用的函数
if(arguments.length){//如果还有要添加的参数
[].push.apply(args,arguments);
return self(args);
}
else return fn.apply(this,args);//执行
}
}([]);
};

var add2= curry(add);
alert(add2(2)(3)(4)());

夜无邪 2017-07-13 3 楼

function add(x)
{
var r = function(y){ return add(x+y); };
r.valueOf = function(){return x;};
r.toString = function(){return x.toString();};
return r;
}
alert(add(2)(3)(4)(5));

我相信这是最简洁的解答了

晚风撩人 2017-07-06 2 楼

 function add(){
var slice = Array.prototype.slice,
args = slice.call(arguments),
add = add;
add = function(){
args = args.concat(slice.call(arguments));
return add;
};
add.toString = function(){
for(var result = 0, i = 0, length = args.length; i < length; i++){
result += args[i];
}
return result;
};
return add;
}
alert(add(2)(3)(4));

浮生未歇 2017-06-26 1 楼

这样感觉更简单些:

 function add(x){
add.valueOf = add.toString = function(){return x}
function add(y){ x+=y; return add}
return add;
}
alert(add(2)(3)(4)(5)(6)(7));