Добрый день, недавно наткнулся на функцию, которая вызывается следующим способом.
func(1)(2)(3)(4)(5);
Код самой функции мне недоступен.
В чем смысл подобного вызова функции?
Пытался искать в интернете, но ничего подобного не нашел.
Приведу пример такой функции:
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);
О, я вспомнил ES6 :)
Некоторые детали.
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
Скорее всего, функция func
возвращает функцию, которая возвращает функцию, которая возвращает функцию и т.д. Нужно это для каррирования.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется таблица БД, созданная с помощью следующего скрипта:
Нужно рекурсивно вызывать функцию через SetTimeout 4 раза, а не пихать while в Star, который вызывается через 1 секунду, получается каждый раз через...