728x90
๊ณ ์ฐจํจ์ Higher order function
- ํจ์๋ฅผ ์ ๋ฌ์ธ์(argument)๋ก ๋ฐ์ ์ ์๊ณ , ํจ์๋ฅผ ๋ฆฌํดํ ์ ์๋ ํจ์
์ฝ๋ฐฑํจ์ callback function
- ๋ค๋ฅธ ํจ์(caller)์ ์ ๋ฌ์ธ์(argument)๋ก ์ ๋ฌ๋๋ ํจ์
- ์ด๋ค ์์ ์ด ์๋ฃ๋์์ ๋ ํธ์ถํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์, ๋ต์ ์ ํ๋ฅผ ๋ปํ๋ ์ฝ๋ฐฑํจ์๋ผ๋ ์ด๋ฆ์ด ๋ถํ์ง
์ปค๋ง ํจ์
- ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์
- ๋ฐ๋ก ์ปค๋ง ํจ์๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋, ๊ณ ์ฐจ ํจ์๋ผ๋ ์ฉ์ด๋ฅผ 'ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ๋ ํจ์'์๋ง ํ์ ํด ์ฌ์ฉํ๊ธฐ๋ ํจ
- ๊ณ ์ฐจ ํจ์๊ฐ ์ปค๋ง ํจ์๋ฅผ ํฌํจ
'ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์'์ 'ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ๋ ํจ์' ๋ชจ๋, ๊ณ ์ฐจ ํจ์๋ก ์ฌ์ฉ
1. ๋ค๋ฅธ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ๊ฒฝ์ฐ
function double(num) {
return num*2;
}
function doubleNum(func, num) {
return func(num);
}
/*
* ํจ์ doubleNum์ ๋ค๋ฅธ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ๊ณ ์ฐจ ํจ์์
๋๋ค.
* ํจ์ doubleNum์ ์ฒซ ๋ฒ์งธ ์ธ์ func์ ํจ์๊ฐ ๋ค์ด์ฌ ๊ฒฝ์ฐ
* ํจ์ func๋ ํจ์ doubleNum์ ์ฝ๋ฐฑ ํจ์์
๋๋ค.
* ์๋์ ๊ฐ์ ๊ฒฝ์ฐ, ํจ์ double์ ํจ์ doubleNum์ ์ฝ๋ฐฑ ํจ์์
๋๋ค.
*/
let output = doubleNum(double, 4);
console.log(output); // -> 8
2. ํจ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ
function adder(added) {
return function(num) {
return num+added;
};
}
/*
* ํจ์ adder๋ ๋ค๋ฅธ ํจ์๋ฅผ ๋ฆฌํดํ๋ ๊ณ ์ฐจ ํจ์์
๋๋ค.
* adder๋ ์ธ์ ํ ๊ฐ๋ฅผ ์
๋ ฅ๋ฐ์์ ํจ์(์ต๋ช
ํจ์)๋ฅผ ๋ฆฌํดํฉ๋๋ค.
* ๋ฆฌํด๋๋ ์ต๋ช
ํจ์๋ ์ธ์ ํ ๊ฐ๋ฅผ ๋ฐ์์ added์ ๋ํ ๊ฐ์ ๋ฆฌํดํฉ๋๋ค.
*/
// adder(5)๋ ํจ์์ด๋ฏ๋ก ํจ์ ํธ์ถ ์ฐ์ฐ์ '()'๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
let output = adder(5)(3); // -> 8
console.log(output); // -> 8
// adder๊ฐ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ณ์์ ์ ์ฅํ ์ ์์ต๋๋ค.
// javascript์์ ํจ์๋ ์ผ๊ธ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
const add3 = adder(3);
output = add3(2);
console.log(output); // -> 5
3. ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ณ , ํจ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ
function double(num) {
return num*2;
}
function doubleAdder(added, func) {
const doubled = func(added);
return function (num) {
return num + doubled;
};
}
/*
* ํจ์ doubleAdder๋ ๊ณ ์ฐจ ํจ์์
๋๋ค.
* ํจ์ doubleAdder์ ์ธ์ func๋ ํจ์ doubleAdder์ ์ฝ๋ฐฑ ํจ์์
๋๋ค.
* ํจ์ double์ ํจ์ doubleAdder์ ์ฝ๋ฐฑ์ผ๋ก ์ ๋ฌ๋์์ต๋๋ค.
*/
// doubleAdder(5, double)๋ ํจ์์ด๋ฏ๋ก ํจ์ ํธ์ถ ๊ธฐํธ '()'๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
doubleAdder(5, double)(3); // -> 13
// doubleAdder๊ฐ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ณ์์ ์ ์ฅํ ์ ์์ต๋๋ค. (์ผ๊ธ ๊ฐ์ฒด)
const addTwice3 = doubleAdder(3, double);
addTwice3(2); // --> 8
728x90