Пусть у нас есть вот такая функция, возвращающая строку:
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)(), вернет массив переданных в параметры чисел.