> почему и как работает такая контрукция 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 , он очень качетвенно вам его дополнил. Свяжите это все с моими мыслями и желаю вам скорейшего просветления.