function B() {
console.log('called at the back!');
function A() (callback) {
callback(); // callback === B
}
A(B);
[1, 2, 3].map(function(element) {
return element * element;
});
document.querySelector('#btn').addEventListner('click', function(e) {
console.log('button clicked');
});
함수 실행을 연결하는 것이 아니라, 함수 자체를 연결함
function handleClick() {
console.log('button clicked');
};
//옳은 예1
document.querySelector('#btn').onclick = handleClick;
//옳은 예2
document.querySelector('#btn').onclick = function() {
handleClick();
};
//옳은 예3
document.querySelector('#btn').onclick = handleClick.bind();
//틀린 예
document.querySelector('#btn').onclick = handleClick();
//함수 printString은 string을 전달받아서 랜덤한 시간 이후에 print함
const printString = (string) => {
setTimeout(function () {
console.log(string);
}, Math.floor(Math.random() * 100) + 1);
};
const printAll = () => {
printString('A');
printString('B');
printString('C');
};
printAll(); //랜덤하게 string이 print됨 -> 비동기 처리
//printString의 파라미터에 callback이 생김
const printString = (string, callback) => {
setTimeout(function () {
console.log(string);
callback();
}, Math.floor(Math.random() * 100) + 1);
};
const printAll = () => {
printString('A', () => {
printString('B', () => {
printString('C', () => {});
});
});
}; // 콜백함수 덕분에 A B C 순서대로 print할 수 있음
const somethingGonnaHappen = callback => {
waitingUntilSomethingHappens();
if (isSomethingGood) {
callback(null, something);
};
if (isSomethingBad) {
callback(something, null);
};
};
somethingGonnaHappen((err, data) => {
if (err) {
console.log('ERR!!');
return;
}
return data;
});
(그림 출처:https://dev.to/jerrycode06/callback-hell-and-how-to-rescue-it-ggj)
콜백함수로 비동기 처리를 다루면, 가독성이 떨어지기 때문에 코드를 유지하거나 보수하기 어려움