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


Спасибо
  • Вопрос задан
  • 517 просмотров
Решения вопроса 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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
30 апр. 2024, в 15:24
3000 руб./за проект
30 апр. 2024, в 15:11
500 руб./в час
30 апр. 2024, в 15:11
5000 руб./за проект