함수가 함수를 반환하는 경우
const func = () => {
return () => {
console.log('hello');
};
};
func함수를 호출하면 함수를 반환한다
반환된 함수는 다른 변수에 저장될 수 있고 변수에 저장된 함수를 다시 호출할 수 있다
const innerFunc = func();
innerFunc(); // hello
func() 부분을 반환값(retunr문) 으로 대체해보면 이해하기 쉽다
const innerFunc = () => {
console.log('hello');
};
innerFunc(); // hello
반환하는 값을 바꾸고 싶을 때는 매개변수를 사용한다
바꾸고 싶은 자리를 매개변수로 만들어 주면 된다
const func = (msg) => {
return () => {
console.log(msg);
};
};
========================
//고차함수에서의 { 와 return 생략
const func = (msg) => () => {
console.log(msg);
};
hello 문자열을 msg 매개변수로 바꿔준다
const innerFunc1 = func('hello');
const innerFunc2 = func('javascript');
const innerFunc3 = func();
innerFunc1(); // hello
innerFunc2(); // javascript
innerFunc3(); // undefined
================================
const innerFunc1 = () => {
console.log('hello');
};
const innerFunc2 = () => {
console.log('javascript');
};
const innerFunc3 = () => {
console.log(); // 빈값은 undefined
};
func함수처럼 함수를 만드는 함수를 고차 함수(high order function) 라고 한다
화살표 함수 문법에 따라 함수의 본문에서 바로 반환되는 값이 있으면 { 와 return을 생략할 수 있다
document.querySelector('#num-0').addEventListener('click', ()=> {
if(operator){
numTwo += '0';
}else {
numOne += '0';
}$result.value += '0';
});
document.querySelector('#num-1').addEventListener('click', ()=> {
if(operator){
numTwo += '1';
}else {
numOne += '1';
}$result.value += '1';
});
document.querySelector('#num-2').addEventListener('click', ()=> {});
document.querySelector('#num-3').addEventListener('click', ()=> {});
document.querySelector('#num-4').addEventListener('click', ()=> {});
document.querySelector('#num-5').addEventListener('click', ()=> {});
이런식으로 이벤트리스너를 연결하는 코드에서 0~9까지의 숫자만 제외한 나머지 부분이 중복 되기 때문에
고차함수를 이용해 숫자를 지정하는 부분은 매개변수로 만들고, 나머지 부분은 함수로 만들어 준다
const onClickNumber = (number) => (event) => {
if (operator) {
numTwo += number;
} else {
numOne += number;
}
$result.value += number;
};
const $operator = document.querySelector('#operator');
const $result = document.querySelector('#result');
const onClickNumber = (number) => {
if(operator){ //연산자 비어 있지 않을 때
numTwo += number;
}else { //연산자 비어 있을 때
numOne += number;
}$result.value += number;
}
document.querySelector('#num-0').addEventListener('click', onClickNumber(0));
document.querySelector('#num-1').addEventListener('click', ()=> {});
document.querySelector('#num-2').addEventListener('click', ()=> {});
document.querySelector('#num-3').addEventListener('click', ()=> {});
중복되는 함수를 변수로 따로 빼내주고,
0~9까지 선택하는 이벤트 리스너의 함수 자리에
onClickNumber함수를 넣어주고 그 매개변수로 각각의 숫자를 넣는다
함수는 항상 return undefined를 생략하고 있는 상태
const onClickNumber = (number) => {
if(operator){ //연산자 비어 있지 않을 때
numTwo += number;
}else { //연산자 비어 있을 때
numOne += number;
}$result.value += number;
//return undefined; 가 생략되어 있다고 생각해야 한다
}
document.querySelector('#num-0').addEventListener('click', onClickNumber('0'));
onClickNumber('0')
함수자리에 함수가 아니라 함수의 undefined를 넣은 셈이다
onClickNumber('0') 이 자리가 함수자리이므로, return에도 함수모양으로 자리를 맞춰줘야 한다
const $operator = document.querySelector('#operator');
const $result = document.querySelector('#result');
const onClickNumber = (number) => {
if(operator){ //연산자 비어 있지 않을 때
numTwo += number;
}else { //연산자 비어 있을 때
numOne += number;
}$result.value += number;
//리턴이 함수가 되도록
return () => {
}
}
하지만 버튼 클릭이 실행되어도 return문 안에는 아무 값이 없어서 실행되지 않는다
그렇다면, 실제로 실행되는 부분인 return에 if문을 넣어줘야 된다
const onClickNumber = (number) => {
return () => {
if(operator){
numTwo += number;
}else {
numOne += number;
}$result.value += number;
}
}
===========================================
//고차함수에서 { 와 return이 있으면 생략 가능하다
const onClickNumber = (number) => () => {
if(operator){ //연산자 비어 있지 않을 때
numTwo += number;
}else { //연산자 비어 있을 때
numOne += number;
}$result.value += number;
}
(number) => () => { ...
이런식으로 화살표가 연달아 있는 모양이 되면 이렇게 해석해야 된다
함수안에 함수가 있다
함수가 함수를 (리턴이 생략된 것) 리턴하고 있다 => 고차함수(high order function)
이렇게 리턴 값에 실제 실행하는 부분을 넣어야 중복도 줄이고 함수도 제대로 돌아가게 만들 수 있다
'Dev. > JavaScript' 카테고리의 다른 글
[레츠기릿JS] 중첩if문 제거하기 / 계산기 만들기 (0) | 2023.05.01 |
---|---|
[레츠기릿JS] 계산기 만들기 / event 객체로 중복 제거하기 (0) | 2023.04.23 |
[레츠기릿JS] 계산기 만들기 (0) | 2023.04.23 |
[레츠기릿JS] 배열 기본 (0) | 2023.04.17 |
[레츠기릿JS] 끝말잇기 만들기 (0) | 2023.04.04 |
댓글