Вызов функции вида func(x)(x)(x)(x)

197
23 марта 2017, 21:27

Добрый день, недавно наткнулся на функцию, которая вызывается следующим способом.

func(1)(2)(3)(4)(5);

Код самой функции мне недоступен.
В чем смысл подобного вызова функции?
Пытался искать в интернете, но ничего подобного не нашел.

Answer 1

Приведу пример такой функции:

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;
}
Answer 2

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);

Answer 3

О, я вспомнил 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

Answer 4

Скорее всего, функция func возвращает функцию, которая возвращает функцию, которая возвращает функцию и т.д. Нужно это для каррирования.

READ ALSO
Проблема с setTimeout, нужно чтобы меду циклами while была пауза

Проблема с setTimeout, нужно чтобы меду циклами while была пауза

Нужно рекурсивно вызывать функцию через SetTimeout 4 раза, а не пихать while в Star, который вызывается через 1 секунду, получается каждый раз через...

153
Вытащить цифры из строки (Javascript)

Вытащить цифры из строки (Javascript)

Почему не удается вытащить цифры из строки ?

257