✔️ callback? 호출하다 + 되돌다
✔️ 다른 코드에 인자로 넘겨줌으로써 그 제어권을 다른 함수에 넘겨주는 함수
<콜백함수예제 setInterval>
let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...)
//func : 함수
//delay : ms 단위의 숫자
//생략가능 ar1~ : func 실행 시 매개변수로 전달할 인자
<콜백함수예제 map>
arr.map(callback(currentValue[, index[, array]])[, thisArg])
//생략가능 thisArg : 콜백 함수 내부에서 this로 인식할 대상 특정 (생략 시 전역객체 바인딩)
callback: function(currentvalue, index, array)
//currentvalue: 배열요소 중 현재값
//index: 현재값의 인덱스
//array: map메서드의 대상이 되는 배열
콜백 함수로 어떤 객체의 메서드를 전달하더라도 그 메서드는 함수로 호출된다.
var obj = {
vals: [1, 2, 3],
logValues: function(v, i) {
console.log(this, v, i)
}
}
obj.logValues(1,2) // {vals: [1,2,3], logValues: f} 1 2
//별도의 this 지정하지 않아 this = 전역객체 = window
[4,5,6].forEach(obj.logValues) //Window {...} 4 0
//Window {...} 5 1
//Window {...} 6 2
방법 1) 전통적인 방식 변수 자체를 함수 내부에 쓰고 closure를 만든다.
방법 2) bind 메서드 활용
콜백 지옥? 콜백 함수를 전달하는 과정이 반복되어 코드 들여쓰기 수준이 깊어지는 현상
주로 이벤트 처리, 서버 통신과 같은 비동기 작업 수행하기 위함인데 가독성, 유지보수에 좋지 않다.
동기적
현재 실행 중인 코드가 완료된 후에야 다음 코드를 실행하는 방식
비동기적
현재 실행 중인 코드의 완료 여부와 무관하게 다음 코드 실행하는 방식
-별도의 요청, 실행 대기, 보류와 관련
setTimeout
addEventListener
XmlHttpRequest
해결법?