일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 프로그래머스
- 코드스테이츠
- javascript
- 토익
- 4주 프로젝트
- 자바스크립트
- programmers
- SQL 고득점 Kit
- 정재남
- 2주 프로젝트
- codestates
- LeetCode
- 제로초
- til
- 코어 자바스크립트
- 손에 익히며 배우는 네트워크 첫걸음
- 백준
- 알고리즘
- 파이썬
- 렛츠기릿 자바스크립트
- 회고
- python
- 리트코드
- 타임어택
- 타입스크립트
- 리액트
- js
- 타입스크립트 올인원
- 리덕스
- Async
- Today
- Total
Jerry
callback function(콜백 함수)란?? 본문
참고로, 이 글은 인프런, Javascript 핵심 개념 알아보기 - JS Flow, 정재남 강의를 보고서 정리한 내용입니다.
오늘 콜백 함수에 대해서 알아보자!
오늘도 콜백 함수를 정복하러 가보자!
💪😎💪😎💪😎💪😎💪😎💪😎💪😎
키워드 의미 살펴보기
Callback function의 단어로 분리해서 해석해보면 아래와 같이 해석할 수 있을 것 같다.
call back function: 호출해서 돌려줄 함수
콜백 함수의 뉘앙스 살펴보기
A: 이 함수를 호출해서 그 결과를 나한테 알려줘.
B: 걱정마. 내가 알아서 처리하고 알려줄게.
대화를 보게 되면, 함수를 넘기고자 하는 대상에게 제어권을 맡기는 걸 인지할 수 있다.
이와 같은 제어권에는 여러가지가 있다.
0. 실행 시점
setInterval은 콜백 함수를 1초에 한 번씩 실행시키는 녀석. 제어권을 setInterval에게 넘겼다.
1. 인자
forEach에는 정해진 규칙이 있어서 그 규칙을 따르지 않으면 forEach를 원하는 대로 사용할 수 없다.
만약에 임의로 value와 index의 위치를 바꾸고 싶어 바꿔 썼다고 해도 실제로 바뀌는 건 인자명뿐이다.
즉, 인자에 대한 제어권은 우리에게 없다!
2. this
this 설명 할 때에 보았던 코드다.
this는 DOM 엘리먼트가 찍힌다. 근데 x가 MouseEvent가 나오는 이유가 무엇일까?
그건 바로 eventListener가 그렇게 정의했기 때문이다!
eventListener가 콜백 함수를 받을 때, this는 이벤트가 발생한 타깃이 되는 엘리먼트로 하고, 첫 번째 인자로 넘겨줄 것은 그 이벤트 자체 객체를 넘겨주겠다고 정의한 것이다.
(참고, listener를 콜백 함수 위치라고 생각하면 된다)
즉, this 키워드에 대한 제어권이 정해져 있는걸 확인할 수 있다.
콜백 함수의 특징
- 다른 함수(A) 의 인자로 콜백 함수(B)를 전달하면, A가 B의 제어권을 갖게 된다.
- 특별한 요청(bind)이 없는 한, A에 미리 정해 놓은 방식에 따라 B를 호출한다.
- 미리 정해놓은 방식이란, 어떤 시점에 콜백을 호출할지, 인자에는 어떤 값을 지정할지, this에 무엇을 바인딩할지 등이다.
주의할 점!
콜백은 '함수'다.
콜백 메소드가 아니다!
obj.logValues(1, 2)는 메서드로 호출하여 [1, 2, 3]과 1, 2를 출력할 것이다.
그렇다면, arr.forEach(obj.logValues)는 어떻게 될까?
=> obj.logValues도 메서드로 호출했으니, this는 obj가 될 것 같다. 하지만, obj.logValues를 호출한 게 아니라 콜백 함수으로서 전달한 것이기 때문에 이건 콜백 함수로 넘긴 꼴이 된다.
결국, 우리가 원하는 this의 값을 얻지 못하고, this는 전역객체를 가리키게 된다.
그럼 obj를 지정하고 싶으면 어떻게 할까?
=> forEach에 넘겨줄 때, 바인드를 넘겨주거나(.bind(obj)) 두 번째 인자로 this.args로 obj를 지정해주면 된다.
이상으로 콜백 함수에 대해서 알아보았다!
질문이나 잘못된 부분이 있으면 피드백 주시면 소통할 준비가 되어 있습니다 :))
'Front > JavaScript' 카테고리의 다른 글
PROTOTYPE (프로토타입)이란?? (0) | 2021.04.23 |
---|---|
클로저(CLOSURE)란?? (0) | 2021.04.22 |
자바스크립트, this란?? 🤷♂️🧐🤷♂️🧐🤷♂️🧐 (0) | 2021.04.20 |
실행 콘텍스트(Execution Context)란? (0) | 2021.04.19 |
이벤트 루프란? (in Javascript) (2) | 2021.04.16 |