(콜백을 쉽게 이해하지 못하시는 분들을 위한 글입니다.
이 글은 최대한 쉽게 설명하려다 보니 정확도가 떨어질 수도 있습니다.)
나도 처음에는 콜백이 진짜 이해가 안 됐다. 대강은 이해가 가도 정확히는 이해가 안됐다
콜백은 다른 곳에서도 많이 봤듯이 진짜 말 그대로 '콜백', 나중에 부른다는 소리다.
물론 이와 같은 문장은 생략이 많이 되있어서 이해가 잘 안될 것이다.
예제와 함께 하자
function a(num,something){
let n = num;
something(n);
}
a(5,(value)=>{
console.log(value); //5
});
(value)=>{} 는 람다식이다. function (value) {}와 같다
a라는 함수를 정의했다. 함수의 인자로는 num과 something이다.
num에는 함수가 아닌 데이터가 들어간다. (여기서는 숫자를 넣어보았다)
(물론 함수를 넣을 수는 있다)
something에는 함수를 넣어주는 곳이다.
이 something이 곧 콜백 함수가 된다.
-----------------------------------코드 설명------------------------------------
a(5,함수);
일단 num부분에 5를 넣고 n이 5가 된다. //let n = num;
그리고 something 함수에 n을 넣고 실행 //something(n);
여기서의 something 함수는 곧 아래쪽의
(value)=>{
console.log(value);
}
이 부분이다.
something(n), something함수에 n값을 넣어줬다. 이 n값은 (value)=>{}의 value로 전달된다.
something(n)이 곧 (value)=>{}이니깐.
한마디로
"5를 넣어주고 그 다음에 console.log가 들어있는 함수를 실행해서 5를 출력한다"
여기서 중요한것은 바로 '그 다음에'다
5를 넣어준 다음에~, console.log를 실행.
이렇게 간단한 코드에서는 그냥
function a(num){
let n = num;
console.log(n);
}
a(5); //5
위와 같이 할것이다.
근데 비동기와 함께라면 필요한 경우가 생긴다.
(비동기는 자세히 설명하지 않겠다만, 짧게 설명하자면 오래걸리는 코드를 넘겨버리는것)
다음과 같이 코드를 짜보겠다.
console.log("first");
setTimeout(()=>{
console.log("twice");
},1000);
console.log("third");
이렇게 짜면 first가 출력되고 1초 뒤 twice를 출력, 그리고 third를 출력할 것 같다.
하지만 그렇지 않다 first가 출력되고 third가 출력된다! 그리고 1초 뒤 twice가 출력된다.
바로 비동기 때문이다.
setTimeout부분이 오래 걸렸기 때문에 다음 코드로 넘어가 버린것이다.
function tw(func){
setTimeout(()=>{
console.log("twice");
func();
},1000);
}
console.log("first");
tw(()=>{console.log("third");});
이렇게 쓰면 first 출력 후 1초 뒤 second 출력, third 출력한다.
콜백은 한마디로 이걸 무조건 끝낸 뒤에 그 다음코드를 실행한다는 소리다.
이 코드 실행 '그리고' 이 코드 실행
근데 가끔 이런 경우가 생길 수 있다.
"아 이 코드 뭔가 오래 걸릴 것 같은 코드인데? 아 이것도, 아 이것도!"
그러면서
"이 코드 실행 '그리고' 이 코드 실행 '그리고' 이 코드 실행 '그리고' 이 코드 실행 '그리고' 이 코드 실행 '그리고' 이 코드 실행 '그리고' 이 코드 실행 '그리고' 이 코드 실행"
같은 코드가 만들어질것이다.
이것이 바로 '콜백 지옥'이다.
콜백 지옥은 Promise로 없앨 수 있다.
'자바스크립트' 카테고리의 다른 글
[Javascript] Selection Sort (0) | 2020.02.15 |
---|---|
node.js cmd 명령어 실행하기 (0) | 2020.02.07 |
node.js 사이트 아이피 따기 (0) | 2020.02.06 |
자바스크립트 BigInt (0) | 2019.12.04 |
자바스크립트 Math 객체 (0) | 2018.01.26 |
댓글