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