const sum = function(a) {
var result = a; // Первый вызов, инициализация
const innersum = a => (result+=a, innersum); // Функция возвращает себя же
innersum.toString = () => result; // сериализация значения для вывода
return innersum;
};
console.log(sum(1)(2)(3)(4)); // 10
console.log(sum(1)(2)(3)); // 6
let tmp = sum(2)(3);
console.log(tmp); // 5
console.log(tmp(5)); //10
console.log(tmp(10)); //20
功能翻译(无“新语言标准”):
function sum(a) {
var result = a;
function innerSum(a) {
result += a;
return innerSum;
}
innerSum.toString = function() {
return result;
};
return innerSum;
}
function func(a) {
return function (b) {
return function (c) {
return function (d) {
return function (e) {
console.log('Ну вот ты и вызвал все 5 функций')
console.log([a, b, c, d, e].join(' '))
}
}
}
}
}
func(1)(2)(3)(4)(5);
class Summator extends Function {
constructor() {
super('return arguments.callee.apply(this, arguments)');
this.value = 0;
}
apply(me, [x]) {
this.value += x;
return this;
}
toString() {
return this.value;
}
}
var func = new Summator(); // Инстанс хранит значение
console.log(func(1)(2)(3)(4)(5)); // 15
// Если использовать существующий инстанс вместо создания нового
console.log(func(1)(2)(3)); // то будет 15+1+2+3 = 21
以及具有不可变功能的版本:
class Summator extends Function {
constructor(x) {
super('return arguments.callee.apply(this, arguments)');
this.value = x || 0;
}
apply(me, [x]) {
return new Summator(this.value + x);
}
toString() {
return this.value;
}
}
function func(x) { // Просто обёртка, чтобы выкинуть new
return new Summator(x);
}
console.log(func(1)(2)(3)(4)(5)); // 15
console.log(func(1)(2)(3)); // 6
这是此类功能的示例:
功能翻译(无“新语言标准”):
哦,我记得 ES6 :)
一些细节。
以及具有不可变功能的版本:
如果不深入到JS代码,那么方案如下:
func(1)(2)(3)(4)(5) 等同于依次调用函数链,其中每个新函数依次分别给出参数 1、2、3、4 和 5。重要的是(!)每个函数调用都返回(结果)某个函数,以便将下一个参数应用于它,除了最后一次使用参数 5 的调用外,结果不一定是函数。
func(1) 给出函数 func_2,我们对其应用参数 2,即 func_2(2),这又给出 func_3,它被称为 func_3(3),然后是调用 func_4(4) 的 func_4,最后调用 func_5(5) 的 func_5。
最有可能的是,一个函数
func返回一个函数,这个函数返回一个函数,这个函数返回一个函数,等等。需要它来咖喱。