let sum = 0;
function add() {
sum += Array.from(arguments).reduce((x, y) => x + y);
add.toString = () => sum;
return add;
}
function curryAdd() {
let total = Array.from(arguments).reduce((x, y) => x + y);
const _add = function () {
total += Array.from(arguments).reduce((x, y) => x + y);
return _add;
}
_add.toString = () => total;
return _add;
}
function curryAddAdvanced() {
const arr = Array.from(arguments);
const _add = function () {
arr.push(...Array.from(arguments));
return _add;
}
_add.toString = () => Array.from(arr).reduce((x, y) => x + y);
return _add;
}
console.log("add", add(1, 2, 3)(4)(6, 7))
console.log("curryAdd", curryAdd(1)(2, 3)(4)(6, 7), curryAdd(1, 2, 3)(4)(6, 7));
console.log("curryAddAdvanced", curryAddAdvanced(1)(2, 3)(4)(6, 7), curryAddAdvanced(1, 2, 3)(4)(6, 7));
function fnToCurry(fn) {
const curry = function () {
const arr = [];
arr.push(...Array.from(arguments));
const _fn = function () {
arr.push(...Array.from(arguments));
return _fn;
}
_fn.toString = () => fn(...arr);
return _fn;
}
return curry;
}
function f1() {
return Array.from(arguments).reduce((x, y) => x + y);
}
const f2 = fnToCurry(f1);
console.log("柯里化", f2(1, 2, 3), f2(1)(2, 3), f2(1)(2)(3));
function fnToDelayCurry(fn) {
const arr = [];
const curry = function () {
arr.push(...Array.from(arguments));
const _fn = function () {
if (Array.from(arguments).indexOf("exec") > -1) {
_fn.toString = () => fn(...arr);
} else {
_fn.toString = Function.toString;
arr.push(...Array.from(arguments));
}
return _fn;
}
return _fn;
}
return curry;
}
function delayFn() {
const args = Array.from(arguments);
return args.join("~");
}
console.log("不会执行函数", fnToDelayCurry(delayFn)(1)(2)(3)(4, 5));
console.log("最后执行函数", fnToDelayCurry(delayFn)(1)(2)(3)(4, 5)("exec"));
console