как уже дали ответ выше return сделан для того что бы вызывать функцию бесконечное число раз.
то есть первый раз когда мы вызываем функциюsum()
она возвращает нам функциюf
которая в свою очередь может быть вызвана или выводить результат если больше не будет использоваться с помощью искуственно добавленого метода f.toString()
Если же функция f
будет вызвана то когда выполнение дойдет к currentSum += b;
она не найдет в своем лексическом окружении currentSum
и через[[Scope]]
поищет выше то есть в функции sum,
там найдет это значение и использует его. После этого вернет саму себя для того чтобы пользователь имел возможность использовать в очередной раз функцию f