fe-learning
fe-learning copied to clipboard
JS实现函数无限操作
JS实现函数无限操作
题目
用Javascript实现一个无限极函数,形如:
operator (1)(2)(3) => f(x)...;
operator (1)(2)(3)() => 6;
注意:执行operator的时候如果最后不是以()结尾(如operator (1)(2)),则这个结果会一直缓存到闭包里。如果下次直接operator (3)(4)的话结果是10.因为他会累加之前的结果。如果你不想这样,那可以通过加()消费缓存的结果。
实现
闭包的一个应用。
function add(x, y) {
if (isNaN(+x)) {
x = 0;
}
if (isNaN(+y)) {
y = 0;
}
return x + y;
}
var operator = (function(op) {
let result = null;
return function (x) {
if (x) {
result = op(x, result);
return arguments.callee; // 在严格模式下无效, 你可以给定函数一个名字
} else {
let ret = result;
result = null;
return ret;
}
}
})(add);
补充一个改良版本:
/**
* 函数 currying
* @param fn
* @return {helper}
*/
const currying = (fn) => {
let res = 0
return function helper (...args) {
if (!args.length) {
return res
}
res += fn.apply(null, args)
return helper
}
}
const sum = currying((...args) => Array.from(args).reduce((prev, curr) => prev + curr))
console.log(sum(1,2,3)(7,8,9)(100)())
const operator = (...args) => {
let params = [...args];
const _add = (...args1) => {
console.log('args1', args1);
params = [...params, ...args1];
if (args1.length > 0) {
return _add;
} else {
return params.reduce((a, b) => a+b, 0);
}
}
return _add;
}