다른 함수에 매개변수로 넘겨준 함수를 말한다. 매개변수로 넘겨 받은 함수는 일단 넘겨받고, 때가 되면 나중에 호출(called back)한다는 것이 콜백함수의 개념이다.
function check(count, link, goto) {
count < 3 ? link() : goto();
}
function linkYoutube() {
console.log('1일 3깡은 기본입니다. 아래 링크를 통해 깡을 시청해주세요');
console.log('https://youtu.be/xqFvYsy4wE4');
}
function goToSleep() {
console.log('오늘 할당량은 모두 채우셨습니다! :)')
}
checkGang(2, linkYoutube, goToSleep);
linkYoutube, goToSleep 함수는 콜백함수콜백 함수는 이름이 없는 익명의 함수를 사용한다. 함수 내부에서 실행되기 때문에 이름을 붙이지 않아도 된다
Js는 null과 undefined 타입을 제외하고 모든 것을 객체로 다룬다.
함수를 변수 or 다른 함수의 변수처럼 사용할 수 있다. 함수를 콜백함수로 사용할 경우, 함수의 이름만 넘겨주면 된다.
function printName(name, callback) {
console.log(name);
callback();
}
function printHello() {
console.log('Hello World');
}
printName('park Young Jae' , printHello);
단순히 함수의 인자에 익명 함수를 쓰면 되겠다고 생각되기 쉽지만, 자바스크립트의 콜백 함수 이용에는 주의점이 있다.
let userData = {
id: 'okvv26',
name: 'Not Set',
setName: function(firstName, lastName) {
this.name = firstName + ' ' + lastName;
}
}
function getUserName(firstName, lastName, callback) {
callback(firstName, lastName);
}
getUserName('PARK', 'Young-Jae', userData.setName);
console.log('1: ', userData.name); // Not Set
console.log('2: ', window.name); // PARK Young-Jae
첫 번째 console.log의 값이 PARK Young-Jae 이기를 기대했지만, Not Set이 출력된다. setName()에서 사용된 this 객체가 window라는 글로벌 객체를 가리키기 때문이다. 따라서 this를 보호할 수 있도록 콜백함수를 만들어야 한다.
...
function getUserName(firstName, lastName, callback, obj) {
callback.call(obj, firstName, lastName); // - (1)
}
getUserName('PARK', 'Young-Jae', userData.setName, userData); // - (2)
console.log(userData.name);
<output>
PARK Young-Jae
(2) 에서 마지막 인자인 userData는 (1)에서 call함수의 첫번째 인자로 전달된다.
즉, call()에 의해 userData에 this 객체가 매핑된다.
...
function getUserName(firstName, lastName, callback, obj) {
callback.apply(obj, [firstName, lastName]); // 인자가 배열
}
getUserName('PARK', 'Young-Jae', userData.setName, userData);
console.log(userData.name);
<output>
PARK Young-Jae
비동기 호출이 자주 일어나는 프로그램의 경우 콜백 지옥이 발생한다 콜백 지옥이란 함수의 매개변수로 넘겨지는 콜백 함수가 반복되어 코드의 들여쓰기 수준이 감당하기 힘들어질 정도로 깊어지는 현상이다.
