코어 자바스크립트를 보며 공부한 내용입니다.
목차
1. 콜백함수란?
2. 제어권
3. 콜백함수는 함수다
4. 콜백 함수 내부의 this에 다른 값 바인딩하기
5. 콜백 지옥과 비동기 제어
콜백함수의 제어권을 넘겨받은 코드가 갖는 제어권
콜백함수로 어떤 객체의 메서드를 전달하더라도, 그 메서드는 메서드가 아닌 함수로서 호출된다.
예제를 통해 살펴보면,
let obj = {
vals : [1, 2, 3],
logValues : function(v, i) {
console.log(this, v, i)
}
};
obj.logValues(1,2); //result01
[4,5,6].forEach(obj.logValues); // result02
결과
logValue는
1) result01 ⇒ 메서드 (dot이 있으니 메서드로서 전달 : 함수로 호출됨)
2) realt02 ⇒ forEach함수의 콜백함수
arr.forEach(callback(currentvalue[, index[, array]])[, thisArg])
Array.prototype.forEach() : forEach MDN
콜백 함수 내부의 this가 객체를 바라보게 하는 방법
// 1. 동기 콜백 : 즉각적
//printImmediately 함수가 호이스팅 되면서 맨위에서 실행되고 1,3,hello,2 순으로 콘솔 확인
function printImmediately(print){
print();
}
printImmediately(()=>console.log('synchronous callback'));
// 2. 비동기 콜백 : 언제 실행될지 예측할 수 없는 콜백
function printWithDelay(print, timeout){
setTimeout(print,timeout);
}
printWithDelay(()=>console.log('async callback'), 2000); // 비동기
드림코딩 by 엘리의 강의를 참고하였습니다.
콜백 함수 안의 콜백함수는 콜백 지옥을 초래할 수 있다. 가독성이 떨어지며, 에러 처리의 어려움이 있다.
해결 방법
1. 기명함수로 변환 : 일회성 함수를 전부 변수에 할당해야하는 단점
2. Promise(ES6) : new 연산자(Promise는 클래스이기 때문에 new 키워드 사용)와 함께 Promise 호출
3. Generator(ES6) : * 이 붙은 함수가 Generator 함수
즉, 비동기 작업이 완료되는 시점마다 next 메서드 호출하여 Generator 함수 내부 소스가 위 → 아래로 진행된다.
자세한 셜명은 function* MDN 참고
4. Promise + async + await
⇒ Promise 에서 then 체이닝을 계속하다보면 코드가 난잡해지는 것을 방지
드림코딩 by 엘리 의 강의를 참고하였습니다.