본문 바로가기
TIL

10. 15. 10일차 TIL 콜백함수와 제어권

by 눈 새 2024. 10. 15.

3주차의 내용이 아직 다 정리가 되지 않아 업데이트를 하지 못하고 있다.. (그치만 중요한 내용이 너무 많고 이해하기 어려운 내용 또한 많다..) 오늘은 3주차 강의의 내용을 느낌적으로 이해한 뒤 4주차 강의를 수강하였고 콜백함수의 정의와 제어권에 대한 개념을 학습했다.


1. 콜백함수 ( Callback Function )

콜백함수란 다른 코드의 인수로서 넘겨주는 함수를 의미한다.

(다른 함수의 매개변수로 들어가는 함수라고 생각해도 좋을 것 같다.)

 

다른 코드의 인수로 넘겨준다는 것을 다시 생각하면 넘겨받는 함수가 존재한다는 의미이다.

이러한 함수의 예로 이전에 배웠던 forEach, setInterval 등을 생각할 수 있다.

 

forEach나 setInterval의 경우 콜백 함수(cb)를 필요에 따라 적잘한 시점에 실행하게 된다.

즉, 제어권이 제어권을 넘겨받은 함수 자체가 갖게 된다는 것이다.


2. 제어권

그렇다면 언제 제어권을 갖게 될까?

1) 호출시점

콜백 함수의 제어권을 넘겨받은 코드는 콜백 함수 호출 시점에 대한 제어권을 갖게 된다.

예를 들어 아래처럼 콜백 함수의 제어권을 갖게 된 setInterval은

0.3s라는 적절한 시점을 본인의 함수에 적어놓은대로 실행하게 된다.

포커스된 부분이 콜백함수(cbFunc)라고 할 수 있다.

 

하지만 지금 표시된 부분을 미리 콜백함수로 선언했다면, timer는 이렇게 사용할 수 있을 것이다.

 

원래대로 콜백함수를 수행한다면 그 호출의 주체와 제어권은 사용자가 된다.

하지만 setInterval 함수에게 넘겨주게 되면 그 호출의 주체와 제어권은 setInterval 함수가 된다.

 

2) 인자

map 함수는 각 배열 요소를 변환하여 새로운 배열을 반환한다.

→ 기존 배열을 변경하지 않고, 새로운 배열을 생성한다.

만약, 콜백함수에서 넣은 매개변수 currentValue와 index의 순서를 바꾸면 어떻게 될까?

당연히 제대로 인식되지 않을 것이고, 그 결과 우리가 의도하지 않은 값을 얻을 것이다.

 

이처럼, map 메서드를 호출해서 원하는 배열을 얻고자 한다면 정의된 규칙대로 작성해야 한다.

이 모든 것은 전적으로 map 메서드 ( 콜백함수를 넘겨받은 코드)에게 제어권이 있다.

즉, 콜백함수를 넘겨받은 코드가 인자의 순서까지 제어권을 갖게 된다는 것이다.

 

3) this

대게적으로 콜백 함수도 함수이기 때문에 기본적으로는 this가 전역객체를 참조한다.

하지만,

제어권을 넘겨받을 코드에서 콜백 함수에 별도로 this가 될 대상을 지정한 경우 그 대상을 참조한다.

다음과 같은 코드들을 보면서 this의 대상을 어떻게 내부에서 조절할 수 있는지 확인해보자.

 

setTimeout 함수는 내부에서 콜백함수를 호출할 때, call 메서드의 첫 번째 인자에 전역객체를 넘긴다.

따라서 이 때의 콜백 함수 내부에서의 this는 전역객체를 가리킨다.

 

forEach도 마찬가지로, 콜백 함수 뒷 부분에 this를 명시해주지 않으면 전역객체를 가리킨다.

 

addEventListener는 내부에서 콜백 함수를 호출할 때,

call 메서드의 첫 번째 인자에 addEventListener 메서드의 this를 상속한다.


3. 콜백함수도 함수이다.

콜백 함수로 어떤 객체의 메서드를 전달하더라도,

그 메서드는 메서드가 아닌 함수로 호출한다.

 


★ 10일차 소감

콜백 함수 내용 중 콜백 지옥, 동기제어/비동기제어에 대해서는 내일 다시 복습한 후 업로드해야 할 것 같다. 특히 동기제어/비동기 제어부분에서 이해가 살짝 부족한 느낌이다. 또한 내일부터는 개념공부 보다 오늘 주어진 과제를 수행하는 데에 시간을 할애하게 될 것 같다. 그래도 콜백함수에 대해 배우고 나니 js 함수에 대한 구조를 조금 더 깊이 이해할 수 있게 된 것 같다. 처음보는 모습의 함수더라도 구조를 하나씩 분석하면서 이 함수가 어떻게 작동하고 있는 것인지 (모든 함수를 분석할 수 있는 것은 아니겠지만..) 어느 정도는 이해할 수 있겠다는 자신감이 생겼다. 그나저나.. 내일부터 해결할 과제는.. 잘 끝마칠 수 있을까?