Hyubert
@Hyubert
JS

Обясните как это работает в js?

почему и как работает такая контрукция sum()()()

function f(b) {
  currentSum += b;
  return f; // <-- не вызывает сама себя, а возвращает ссылку на себя
}

sum(1)(2) == 3; // 1 + 2
sum(1)(2)(3) == 6; // 1 + 2 + 3
sum(5)(-1)(2) == 6
sum(6)(-1)(-2)(-3) == 0
sum(0)(1)(2)(3)(4)(5) == 15


Спасибо
  • Вопрос задан
  • 521 просмотр
Решения вопроса 2
@hufawoso
Думаю должно быть как-то так:
function sum(currentSum) {
    if (!currentSum) return 0;
    return function f(b) {
        if (b !== undefined) {
            currentSum += b;
            return f;
        } else {
            return currentSum;
        }
    }
}
Ответ написан
@vshvydky
> почему и как работает такая контрукция sum()()()
Я поясню чуть абстрактно, отойдя в сторону, надеюсь будет понятно.
функция как собственно и большинство вещей в js это объект.
Объект может быть передан как переменная и вызван для выполнения.
Пример передачи объекта (функции )на выполнение это setTimeout(funcName, 100); // функция передается без скобок, а значит сет таймаут получает ее код и через 100 милисекунд его исполнит.
Такая же ситуация происходит , когда подключаются модули ререз рекваер
const moduleName = require('moduleFile');
мы получаем в переменную moduleName ссылку на функцию, то есть теперь moculeName является указалетелем на функцию, которая экспортирована внутри модуля moduleFile, для ее вызова мы добавим () к ссылке, ровно как можно выполнить напрямую require('moduleFile')() или require('moduleFile')(params) в этом случае функция переданная из модуля выполнится, но ссылки на нее не будет, по сути это будет анонимная функция.
Запустить анонимную функцию можно как
(function (params){ // действиия }) (realParams) // в такой консрукции будет произведен запуск анонимной функции и в ее params будут переданы параметры запуска reealParams
Теперь возвращаемся к sum()()()
Такую запись можно трактовать так:
sum = function(param){// code ; // return function };
sum1 = sum(); // Здесь произойдет выполнение функции sum и при возврате значения, будет возвращена функция (как объект) словно вы ее получили из вешнего модуля
по сути у вас будет создано замыкание которое будет держать в памяти череду функций sum и ссылки на них для доступа к ним (для вызова)
ну соотвтетсвено sum2 = sum1(); будет делать тоже самое.
Кратко это можно записать как sum()()() то есть выполнение первой функци, возврат текста второй функции, его выполнение и возврат и и запуск третей функции. Ваш пример в предыдущем вопросе был более верным, сейчас вы зря его упростили. Но посмотрите на ответ hufawoso , он очень качетвенно вам его дополнил. Свяжите это все с моими мыслями и желаю вам скорейшего просветления.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vintage
Начнём с того, что ваш код не работает :-) На это в общем и закончим.
Ответ написан
crazy_leo
@crazy_leo
Frontend Developer
Прочитайте про замыкания.
Вложенная функция в данном случае запоминает верхние переменные, и каждый раз когда вы вызываете эту функцию она плюсирует значение переменной currentSum
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы