Бесконечное каррирование

124
11 января 2021, 06:50

Есть вот такой код. Мне надо переписать его так чтобы он например при вызове console.log(add(1)(2)(3)) вернул число 6 и без пустых скобок в конце

const add = (a) => { 
  let sum = a; 
  const func = b => { 
    if (b) { 
      sum += b; 
      return func; 
    } else { 
      return sum; 
    } 
  }; 
  return func; 
};

Answer 1

Ситуация такая, что функция в любом случае должна возвращаться. Но как понять, что это последний вызов в цепочке? Никак!

Тут фишка в другом: console.log неявно вызывает метод toString, который можно перезаписать

Есть метод valueOf, который используется, когда значение приводится к числу

const add = (a = 0) => { 
  let sum = a; 
  const func = (b = 0) => { 
    sum += b; 
    return func; 
  }; 
 
  func.toString = () => sum // Переопределяем метод toString 
  func.valueOf = () => sum // Перезаписываем valueOf 
 
  return func; 
}; 
 
 
console.log(add(1)(1)(1)(7)); 
console.log(add(1)(2)(3)); 
console.log(add(0)(0)(0)(1)()()()(1)); // вызов с пустыми скобками, то же что и вызов с нулем 
 
// Фокусы с valueOf 
console.log(add(1)(1) + add(5)(3)); 
console.log(add(1) + add() + add(9));

READ ALSO
Загрузить xml при помощи js

Загрузить xml при помощи js

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

102
Анимация при появлении в DOM

Анимация при появлении в DOM

Как в vuejs сделать анимацию при появлении блока в dom

109
Почему async/await работает корректно, хотя ему не передаются коллбэки

Почему async/await работает корректно, хотя ему не передаются коллбэки

Пытаюсь разобраться в промисах и async/awaitНашёл на хабре этот пример:

107