JavaScript 기술면접 질문 리스트업해보면 call, apply, bind의 차이점이 단골질문으로 자주 나온다.
그래서 정리해봤다!
call
,apply
,bind
는 함수 호출 방법을 지정해서this
를 그때그때 알 맞은 객체로 명시적으로 바꿔주는 메소드다.
call, apply
와 bind
의 차이점call
, apply
는 함수를 호출해서 인수 전달.bind
는 함수를 호출 ❌ 함수와 this값을 유지하는 새로운 함수를 생성call
과 apply
의 차이점call
의 경우, 호출한 함수의 인수를 ,
로 구분한 리스트 형식으로 전달.apply
는 배열[]
로 전달.자바스크립트에서 함수를 호출하는 방법에는 일반적으로 함수 뒤에
( )
를 붙여 호출하는 방법과
call
,apply
를 붙여 호출하는 방법이 있다.
call
메서드는 메서드의 호출 주체인 함수를 즉시 실행하는 메서드function.call(thisArg[ , arg1, arg2[, ...]])
- thisArg : 함수 호출에 제공되는
this
의 값- arg1, arg2, ... : 함수가 호출되어야하는 인수
예
let person1 = { name: 'Olivia' };
let person2 = {
name: 'Seulgi',
greeting: function() {
console.log(this.name + '야, 안녕~?');
}
};
person2.greeting(); // Seulgi야, 안녕~?
person2.greeting.call(person1); // Olivia야, 안녕~?
- `person2` 함수를 호출하고 있지만, `call`메소드를 통해 **첫 번째** 매개변수(thisArg)에 `person1`을 넣어줘서
`this`의 값은 `person1`이 되어 **Olivia가 출력**된다.
### apply()
> `apply`메서드는 `call`메서드와 같이 메서드의 호출 주체인 함수를 **즉시 실행**하는 메서드
```jsx
function.apply(thisArg, [argsArr])
this
의 값call
: 인자를 넣음apply
: 인자를 묶어서 배열로 넣음function sum(x, y){
return x + y;
}
console.log(sum(3, 6)); // 9
console.log(sum.call(this, 3, 6)); // 9
console.log(sum.apply(this, [3, 6])); // 9
let person = {
name : "Olivia"
}
function introduce(age, location) {
console.log(`${this.name}은 ${age}살이고, ${location}에 살고 있습니다`);
}
introduce.apply(person, [29, "Seoul"]); // Olivia은 29살이고, seoul에 살고 있습니다
배열 중 가장 큰 값이나 작은 값 구하기 같은 것
let arr = [1, 3, 5, 7, 9, 11, 13, 15];
let maxNum = Math.max(...arr);
conosle.log(maxNum); // 15
let arr = [1 ,3, 5, 7, 9, 11, 13, 15];
let maxNum = Math.max.apply(null, arr);
console.log(maxNum); // 15
bind
메서드는 함수를 즉시 실행하지 않고, 넘겨 받은 인수를 바탕으로 새로운 함수를 반환하는 메서드
함수가 가르키는this
만 바꾸고 호출하지는 않는다.
변수를 할당하여 호출하는 형태로 사용할 수 있고 커스텀this
를 가르키는 함수를 만들 수 있다function.bind(thisArg[ , arg1[, arg2[, ...]]])
- thisArg : 바인딩 함수가 타겟 함수의
this
에 전달하는 값.
전달하는게 없으면,null
- arg1, arg2, ... : 함수가 호출되어야하는 인수
let person1 = {
name: "Olivia",
age: 25,
location: "Dublin"
}
let person2 = {
name: "Seulgi",
age: 29,
location: "Seoul",
introduce: function(age, name) {
console.log(`${this.name}은 ${this.age}살이고, ${this.location}에 살고 있습니다`);
}
};
person2.introduce(); // Seulgi은 29살이고, Seoul에 살고 있습니다
let oldMe = person2.introduce.bind(person1);
oldMe(); // Olivia은 25살이고, Dublin에 살고 있습니다
this
를 영구하게 가질 수 있다.[ 💡 NOTE ]
- call(), apply(), bind() 메소드는 함수시 'this'를 바인딩 할 때 사용한다.
- call()과 apply() 메소드는 메소드의 호출 주체인 함수를 '즉시 실행'한다.
- call()과 apply() 메소드의 차이는 apply()메소드는 '배열'로 인자를 받는다.
- bind()메소드는 call()과 apply()메소드와 다르게 함수를 즉시 실행하지 않고, '새로운 함수'를 반환한다.