Функция, возвращающая функцию в JavaScript

Пусть у нас есть вот такая функция, возвращающая строку:

function func() { return '!'; } let result = func(); alert(result); // выведет '!'

Давайте теперь вместо строки, по аналогии, вернем анонимную функцию:

function func() { return function() { return '!'; }; } let result = func(); // в переменной result будет функция alert(result); // выведет 'function() {return '!';}'

Как вы видите, переменная result теперь представляет собой функцию. Давайте выведем на экран результат ее работы. Для этого напишем ей круглые скобки:

function func() { return function() { return '!'; }; } let result = func(); alert( result() ); // выведет '!'

Так как вызов func() возвращает функцию, то мы можем сразу же и вызвать эту возвращаемую функцию, вот так: func()() - первые круглые скобки получают результат функции func (который сам является функцией), а вторые круглые скобки применяются к результату func.

Давайте попробуем:

function func() { return function() { return '!'; }; } alert( func()() ); // выведет '!'

Сделайте функцию func1, которая будучи вызвана вот так: func1()(), вернет число 1. Сделайте аналогичную функцию func2, возвращающую число 2. Найдите сумму результатов этих функций.

Любой уровень вложенности

Могут быть и такие вызовы функций: func()()() и func()()()() - и так далее до бесконечности.

Для этого нужно, чтобы внутренняя функция тоже возвращала функцию, та - еще одну и так далее. Вот пример:

function func() { return function() { return function() { return '!'; }; }; } alert( func()()() ); // выведет '!'

Сделайте функцию func, которая будучи вызвана вот так: func()()()()(), вернет '!'.

Параметры

В изученные нами вызовы функций можно передавать параметры. В следующем примере внутренняя функция ожидает параметром строку и выводит ее на экран:

function func() { return function(str) { return str; }; }

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

function func() { return function(str) { return str; }; } alert( func()('!') ); // выведет '!'

Давайте сделаем так, чтобы и первая функция принимала параметр, и вторая. А результатом вызова сделаем сумму этих параметров:

function func(num1) { return function(num2) { return num1 + num2; }; } alert( func(1)(2) ); // выведет 3

Сделайте функцию func, которая будучи вызвана вот так: func(2)(3)(4), вернет сумму переданных в параметры чисел.

Сделайте функцию func, которая будучи вызвана вот так: func(2)(3)(4)(5)(), вернет массив переданных в параметры чисел.