다른 코드(함수 또는 메서드)에게 인자로 넘겨줌으로써 그 제어권도 함께 위임한 함수이다. 콜백함수를 위임받은 코드는 자체적인 내부 로직에 의해 이 콜백 함수를 적절한 시점에 실행할 것이다.
1) 콜백함수의 제어권을 넘겨받은 코드는 콜백함수 호출 시점에 대한 제어권을 가진다.
ex) 0.3초에 한 번씩 console 출력
2) 콜백함수의 제어권을 넘겨받은 코드는 콜백함수를 호출할 때 인자에 어떤 값들을 어떤 순서로 넘길 것인지에 대한 제어권을 가진다.
3) 콜백함수의 this가 무엇을 바라보도록 할 지 정해져 있을 수 있다.
=> 정하지 않았을 경우 this는 전역객체를 바라본다.
01 var obj = { 02 vals : [1, 2, 3], 03 logValues : function(v, i) { console.log(this, v, i); 05 } 06 }; 07 obj.logVlues(1, 2); // { vals : [1, 2, 3], logValues : f} 1 2 08 [4, 5, 6].forEach(obj.logValues); // Window {...} 4 0 09 // Window {...} 5 1 10 // Window {...} 6 2
07번 줄에서 obj.logValues는 메서드로서 호출되었다.
주의깊게 봐야하는 부분은 08번 줄이다. 여기서 obj.logValues는 메서드이지만 forEach의 콜백함수로서 전달되었다. obj를 this로 하는 메서드를 그대로 전달한 것이 아니라, obj.logValues가 가리키는 함수만 전달한 것이다.
즉, 어떤 함수의 인자에 객체의 메서드를 전달하더라도 이는 결국 메서드가 아닌 함수일 뿐이다.