High Order Function - TEAM-ARK/inflearn-clone-front GitHub Wiki
์ด๋ฒ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ฝ๋ฐฑํจ์์๋ก ๊ฐ์ ์ ๋ฌํด์ผ ๋ ๋ HOF์ผ๋ก๋ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์์๋ค
์ฝ๋ 1-1.
// ๊ธฐ์กด ์ฌ์ฉ ๋ฐฉ์ : ์ด๋ฒคํธ ์ฝ๋ฐฑํจ์์ ์ธ์๊ฐ ํ์ํ๋ฉด ์ต๋ช
ํจ์ ํํ๋ก ์ ๋ฌ
const onClickButton = (textList: string[], index:number, boxType: 'whatYouCanLearn' | 'expectedStudents' | 'requiredKnowledge') => {
const textArray = [...textList];
textArray.splice(index, 1);
switch (boxType) {
case 'whatYouCanLearn':
dispatch({
type: DELETE_ITEM_WHATYOUCANLEARN,
data: textArray,
});
break;
case 'expectedStudents':
dispatch({
type: DELETE_ITEM_EXPECTEDSTUDENTS,
data: textArray,
});
break;
case 'requiredKnowledge':
dispatch({
type: DELETE_ITEM_REQUIREDKNOWLEDGE,
data: textArray,
});
break;
default:
console.error('boxType is wrong');
}
}
<TextListBox key={index} onClick={() => onClickButton(data?.textlist, index)} />
์ฝ๋ 1-2.
// ์๋กญ๊ฒ ์ ์ฉํ๋ ๋ฐฉ์ : ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ์ ๋ฌ
const onClickButton = (textList: string[], index:number, boxType: 'whatYouCanLearn' | 'expectedStudents' | 'requiredKnowledge') = () => {
const textArray = [...textList];
textArray.splice(index, 1);
switch (boxType) {
case 'whatYouCanLearn':
dispatch({
type: DELETE_ITEM_WHATYOUCANLEARN,
data: textArray,
});
break;
case 'expectedStudents':
dispatch({
type: DELETE_ITEM_EXPECTEDSTUDENTS,
data: textArray,
});
break;
case 'requiredKnowledge':
dispatch({
type: DELETE_ITEM_REQUIREDKNOWLEDGE,
data: textArray,
});
break;
default:
console.error('boxType is wrong');
}
}
<TextListBox key={index} onClick={onClickButton(data?.textlist, index)}
๊ทธ ์ ์ anonymous ํจ์๋ฅผ ๊ทธ ์๋ฆฌ์์ ๋ง๋ค์ด์ ๊ฐ์ ์ ๋ฌํ์๋๋ฐ ๋ ์น์ํ ๋ฐฉ๋ฒ์ด ์๋ ๊ฑธ ์๊ฒ ๋๋ ์์ผ๋ก ์ด๋ ๊ฒ ์ฌ์ฉํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ ๋ค
๊ทธ ์ ์ HOF๊ฐ ๋ฌด์์ธ์ง ๋ช ํํ ์๊ณ ๊ฐ ํ์๊ฐ ์๋ค
High Order Function
- ํ๋ ์ด์์ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค.
- ํจ์๋ฅผ ๊ฒฐ๊ณผ๋ก ๋ฐํํ๋ค.
Use Case
array method
- Array.prototype.filter(), map(), reducer()
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);
console.log(result);
- filter()
- ํํฐ๋ง ํ๋ ์กฐ๊ฑด์ ํจ์๋ฅผ ํตํด ์ ์ดํ๋ ๊ฒ
ramda
- ์ฝ์ด๋ด๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค.
๋ด๊ฐ ์์ฑํ ์ฝ๋๋ HOF ์ธ๊ฐ?
-
ํจ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒ์ ๋ง์ง๋ง ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ HOF์ด๋ผ๊ธฐ ๋ณด๋จ ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ผ๊ณ ํํํ๋๊ฒ ๋ง๋ ๊ฑธ๊น
-
๊ทธ๋๋ 1-1.๋ณด๋ค 1-2. ์ฝ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ ๊ฒ ์ฌ์ฉํ ๊ฒ ๊ฐ๋ค.
- https://developer.mozilla.org/ko/docs/Web/API/EventTarget/addEventListener#%EB%A9%94%EB%AA%A8%EB%A6%AC_%EC%9D%B4%EC%8A%88
- ๋ฆฌ์กํธ์ useCallback์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
useCallback
- ํจ์ memoization(๋ฉ๋ชจ์ด์ ์ด์ )ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ hook ํจ์
- ์ปดํฌ๋ํธ ์์ ํจ์๊ฐ ์ ์ธ์ด ๋์ด ์๋ค๋ฉด ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋ ๋ง๋ค ์๋ก์ด ํจ์๊ฐ ์์ฑ ๋จ
- course_info๊ฐ ํ์ด์ง ๊ทธ ์์ฒด์ด๋ฏ๋ก ๋ ๋๋ง์ด ๋ค์ ๋ ์ผ์ ์์ด์ useCallback์ ์ฌ์ฉํด๋ ์๋ฌด๋ฐ ํจ๊ณผ๊ฐ ์์ ๊ฒ ๊ฐ๋ค.
- ๊ทธ๋์ useCallback์ผ๋ก ๋ฐ๊พผ ์ฝ๋๋ฅผ ์ปค๋ฐํ๋ ค๋ค๊ฐ ์๋ฏธ์๋ ๊ฒ ๊ฐ์์ ๋ฐ์ํ์ง ์์๋ค.
- course_info๊ฐ ํ์ด์ง ๊ทธ ์์ฒด์ด๋ฏ๋ก ๋ ๋๋ง์ด ๋ค์ ๋ ์ผ์ ์์ด์ useCallback์ ์ฌ์ฉํด๋ ์๋ฌด๋ฐ ํจ๊ณผ๊ฐ ์์ ๊ฒ ๊ฐ๋ค.
์ฐธ๊ณ ๋ฌธํ
- https://medium.com/@la.place/higher-order-function-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-1c61e0bea79
- ๊ณ ์ฐจ ํจ์ ์ดํดํ๊ธฐ
- useCallback