实现一个函数,运算结果可以满足如下预期结果:
add(1)(2) // 3
add(1, 2, 3)(10) // 16
add(1)(2)(3)(4)(5) // 15
实现一个函数,运算结果可以满足如下预期结果:
add(1)(2) // 3
add(1, 2, 3)(10) // 16
add(1)(2)(3)(4)(5) // 15
function add(x) {
var sum = x;
var tmp = function (y) {
sum = sum + y;
return tmp;
};
tmp.toString = function () {
return sum;
};
return tmp;
}
console.log(add(1)(2)(3)); //6
console.log(add(1)(2)(3)(4)); //10
function add(){
var sum = 0;
var slice = Array.prototype.slice;
var f = function(){
var params = slice.apply(arguments);
params.forEach(function(it){
sum+=it;
});
f.val = sum;
return f;
}
return f.apply(null,slice.apply(arguments));
}
console.info(add(1)(2)(3)(4)(5)(6,7).val);// 28
const add = sum => {
const calc = n => add(sum + n)
calc.toString = () => sum
return calc
}
add(1)(2)(3)(4)
不管是改写toString方法还是valueOf方法(toString会调用valueOf),都无法实现直接读取值,因为直接读取值并不会调用toString方法,所以add(1): { [Function: b] toString: [Function] } ; add(1)+0 : 1。
代码:
function add(){
var sum = 0;
for(let num of arguments)
sum += num;
function b(){
for(let num of arguments)
sum += num;
return b;
};
b.toString = function(){return sum};
return b;
}
console.log(add(1));// { [Function: b] toString: [Function] }
console.log(add(1)+0);// 1
非主流版:
function add(...values) {
let tmp = (x) => {
values.push(x);
return tmp;
};
tmp.toString = () => new Function('return ' + values.join('+'))();
return tmp;
}
console.log(add(1)(2)); // -> 3
console.log(add(1, 5)(2)); // -> 8
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决