객체의 메서드를 호출하거나, 생성자 함수 또는 클래스로 새로운 인스턴스를 만들 때, this를 많이 사용한다.
다른 언어와 달리 자바스크립트에서 this는 상황에 따라서 다른 것을 가리키는 경우가 있기에
종종 this가 무엇을 가르키는지 헷갈릴 때가 많다.
따라서 이번 포스팅에서는 이런 헷갈리는 this가 가리키는 것을 아예 고정시키는 메서드
bind, apply, call 각각의 사용법 그리고 차이점에 대해서 설명하고자 한다.
참고로 this에 관해서는 아래 포스팅에서 자세히 설명해 두었다.
(Javascript) this란 무엇인가? this 사용방법
this는 객체 또는 함수와 같이 사용되는 키워드이다. 객체 내에서 사용되는 this는 호출방식에 따라 가리키는 것이 달라질 수 있다. 1. 함수가 객체의 메서드로 호출되는 경우this는 해당 객체
lemu-devblog.tistory.com
bind
bind 메서드를 사용해 함수를 호출하면, 원하는 값으로 해당 함수 내의 this 값을 영구적으로 고정시킬 수 있다.
이 점에서는 apply, call과 유사하지만 차이점이 있다면,
bind는 함수를 즉시 호출하지 않고, 나중에 호출할 때 사용된다는 것이다.
따라서 언제 호출 될지 모르는 이벤트 핸들러, 콜백 함수에서 사용하면 좋다.
bind 매서드는 나중에 호출돼야 되기 때문에 원래의 함수와 동일한 동작을 하는 새로운 함수를 만들어 this값을 고정시킨다.
따라서 apply나 call을 사용할때보다 더 많은 메모리가 사용된다.
const grape = { cost: 3000 };
function getCost() {
return this.cost;
}
const boundGetCost = getCost.bind(grape); //this를 grape로 bind
console.log(boundGetCost()); // 3000
call, apply
위에서 설명했듯이 call과 apply는 this 값을 고정할 수 있고,
함수를 즉시 호출한다는 점에서 공통점을 갖고 있다. (즉시 호출하기에 bind와 달리 새로운 함수를 만들지 않는다)
둘의 차이점이 있다면 call은 인자들을 쉼표로 구분하여 전달받고, apply는 인자들을 배열로 전달받는다는 것이다.
참고로 bind도 call처럼 인자들을 쉼표로 구분하여 전달받는다.
사실 apply를 사용하는 대신 call에 확산 연산자(...)를 사용하면 동일한 결과를 낼 수 있다. (굳이 apply를 쓸 필요가 없다)
const grape = { cost: 3000 };
function getCost() {
return this.cost;
}
function getCost(prefix, suffix) {
return `${prefix} ${this.cost} ${suffix}`;
}
console.log(getCost.call(grape, 'Cost is', '₩')); // Cost is 3000₩
console.log(getCost.apply(grape, ['Cost is', '₩'])); // Cost is 3000₩
정리
bind와 call, apply를 정리하면서 해당 포스팅을 마무리한다.
특징 | bind | call | apply |
this | this 고정 | ||
반환 | 새로운 함수 반환 | 새로운 함수 반환x | |
호출시점 | 함수 나중 호출 | 함수 즉시 호출 | |
인자 | 쉼표로 인자를 구분해서 받음 | 배열로 인자를 받음 |
'JAVASCRIPT' 카테고리의 다른 글
(Javascript) 2차 배열 만드는 방법, 2차 배열의 참조가 같아지는 오류 (0) | 2024.06.27 |
---|---|
(Javascript) iterable, 유사 배열(arraylike)의 차이점, 사용법 (0) | 2024.05.26 |
(Javascript) 논리 연산자 &&과 ||의 단축 평가 (0) | 2024.05.23 |
(Javascript) hoisting(호이스팅)이란? 발생 배경, 종류, TDZ (0) | 2024.05.05 |
(Javascript) this란 무엇인가? this 사용방법 (0) | 2024.04.28 |