this

call, apply, bind의 차이를 설명해 주세요

예상 시간
5
30초 답변

꼬리질문

조금 더 깊게 물어본다면

답변 뒤에 이어질 수 있는 질문들을 하나씩 열어볼 수 있어요.

bind로 만든 함수에 다시 bind를 호출하면 this가 바뀌나요?

부가 설명

function introduce(prefix, suffix) {
  return `${prefix} ${this.name}${suffix}`;
}
 
const user = { name: "Joon" };
 
introduce.call(user, "Hi", "!");
introduce.apply(user, ["Hi", "!"]);
 
const boundIntroduce = introduce.bind(user, "Hi");
boundIntroduce("!");

결과는 비슷하지만, 사용하려는 상황이 조금 다릅니다.

  • 지금 바로 호출해야 하고 인자가 이미 나열되어 있으면 call
  • 지금 바로 호출해야 하고 인자가 배열로 준비되어 있으면 apply
  • 나중에 호출할 콜백으로 넘겨야 하면 bind

요즘은 spread syntax 덕분에 apply의 사용 빈도가 줄었습니다.

introduce.call(user, ...["Hi", "!"]);

그래도 apply를 알아야 하는 이유는 오래된 코드나 라이브러리 내부에서 아직 보일 수 있고, “인자 배열을 펼쳐 호출한다”는 의도가 드러나는 경우가 있기 때문입니다.

한 줄 정리

callapplythis를 바꿔 즉시 실행하고, bindthis가 고정된 함수를 나중에 쓰려고 만들어 둡니다.