콜백함수
개념?
콜백함수는 간단하게 다른 함수에 매개변수로 넘겨준 함수를 말한다.
매개변수로 넘겨받은 함수는 일단 넘겨받고, 때가 되면 나중에 호출(called back)한다는 것이 콜백함수의 개념이다.
예시
function checkGang(count, link, good) {
count < 3 ? link() : good();
}
function linkGang() {
console.log('1일 3깡은 기본입니다. 아래 링크를 통해 깡을 시청해주세요');
console.log('https://youtu.be/xqFvYsy4wE4');
}
function goodGang() {
console.log('오늘 할당량은 모두 채우셨습니다! :)')
}
checkGang(2, linkGang, goodGang);
checkGang함수를 실행할 때 2라는 데이터가 들어왔고 이는 count보다 3이 작기 때문에 link() 함수를 실행하게 된다.
쉽게 말해 필요할 때 쓰고 싶어서 저장한 함수?? 라고 생각하면 된다.
예시2
function add(a, b) {
return a + b;
}
function sayResult(value) {
console.log(value);
}
sayResult(add(3, 4));
이를 콜백함수로 바꾸면??
목적
더하는 함수를 쓰고 싶다. 근데 여기에 callback 넣으면 새로운 함수로 데이터를 가공할 수가 있다. 단순히 더하는 함수가 아니라 더하 는 함수를 출력하는 함수로!!! 새로운 함수를 활용하고 싶을 때 사용하면 좋다.
function add(a,b,callback){
return callback(a+b)
}
function result(value){
return console.log(value)
}
undefined
add(3,5,result)
VM2081:13 8
자바스크립트의 구조
자바스크립트의 처리방식은 크게 콜스택이라는 메모리에서 함수들을 받아서 스택 방식으로 처리하는 구조입니다. 예를들어 메인함수가 들
어오고 console.log가 들어오면 차례차례 들어오고 데이터가 하나씩 처리될 때마다 사라지는 구조라고 볼 수 있습니다. (ex 1. 메인, 콘솔
콘솔 메인 종료)
그런데 여기서 문제는 자바스크립트가 단일 Thread이기 때문에 한 번에 같은 일을 처리할 수가 없는거죠. 이래서 나온게 비동기적 방식을
따와서 새롭게 처리하려고 합니다. 특히 web API인 DOM AJAX setTimeOut 인 일급객체의 함수를 사용하여 window element
webGL과 같은 일급 객체를 자바스크립트가 통제하기 위해서 여기서 우리는 eventQ eventLoop라는 공간을 활용합니다.
eventQ eventLoop
eventQ에서 webAPI는 콜백함수로 넣어져있습니다. 이 때 만약 스택이 빈다면 eventLoop로 들어가 while문이 돌면서 스택에 push하게 됩니다.
예제
setTimeout(()=>{
return console.log("비동기적 처리입니다")
},0)
console.log("단순 콜스택 처리입니다")
VM951:9 단순 콜스택 처리입니다
undefined
VM951:4 비동기적 처리입니다
결론
아무리 0초 단위로 함수를 실행한다고 해도 우리가 생각하는 바로 실행하는 것이 아닙니다. 당연히 콜스택에 먼저 들어가 있는 setTimeout함수가 실행이 되지만 콜백함수를 부르면서 바로 종료가 됩니다. 이 콜백함수는 이벤트큐에 들어가게 되구요. 그러는 사이 console.log 함수가 먼저 실행되고 스택에 아무것도 없게 되면 setTimeout 함수의 콜백함수가 이벤트 루프를 통해 콜스택에서 실행이 됩니다.
조감도
비동기가 처리되는 과정을 살펴보자.
- 우선 버튼 클릭과 같은 이벤트가 발생하면
- DOM 이벤트, http 요청, setTimeout 등과 같은 비동기 함수는 C++로 구현된 web API를 호출한다. 예를 들어 setTimeout의 경우, 스택에 쌓이게 되면 콜백 함수를 실행시키고 콜스택에서 사라진다.
- web API는 콜백 함수를 이벤트 큐(콜백 큐)에 밀어넣는다. 이때 web API는 함수의 실행 순서와 상관없이 끝난 순서대로 이벤트 큐에 넣는다. setTimeout의 지연 시간이 빠른순대로 넘어간다고 생각하면 된다.
- 그럼 이벤트 큐는 대기하다가 스택이 텅 비는 시점에 이벤트 루프를 돌리게 된다(콜스택에 넣음). 이벤트 루프의 기본 역할은 큐와 스택, 두 부분을 지켜보다가 스택이 비는 시점에 콜백을 실행시켜 주는 것.
출저
'Javascript' 카테고리의 다른 글
callback함수를 적용해보기! (0) | 2021.10.20 |
---|---|
JS function 코딩하면서 이해하기 (0) | 2021.10.20 |
더미데이터 버튼 클릭시 보여주기 위한 onclick=button() 만들기 (0) | 2021.10.02 |
함수로 tag 여러 태그 만들고 데이터 값 넣기 (0) | 2021.09.29 |
메모 (0) | 2021.09.10 |