call
, bind
, apply
는 JavaScript에서 함수를 호출하고 함수의 this
값과 인수를 설정하는 데 사용되는 메서드입니다. 이들의 차이점은 다음과 같습니다:
1. call
: call
메서드는 함수를 호출하는 동시에 함수 내의 this
값을 설정하고, 인수를 개별적으로 전달합니다. call
메서드는 함수를 호출하는 즉시 실행되며, 첫 번째 인수로 전달된 객체가 함수 내의 this
값으로 설정됩니다. 그 이후의 인수는 호출된 함수의 매개변수로 전달됩니다.
function sayHello(message) {
console.log(message, this.name);
}
const person = { name: 'John' };
sayHello.call(person, 'Hello'); // 출력: Hello John
2. bind
: bind
메서드는 함수를 호출하는 것이 아니라, 함수를 새로운 컨텍스트와 함께 묶어 새로운 함수를 생성합니다. 즉, bind
메서드를 호출하면 새로운 함수가 반환됩니다. 이 새로운 함수는 원래 함수와 동일한 기능을 가지지만, bind
메서드에 전달한 객체가 새로운 함수의 this
값으로 설정됩니다. 그리고 필요에 따라 추가 인수를 바인딩한 새로운 함수를 생성할 수도 있습니다.
function sayHello(message) {
console.log(message, this.name);
}
const person = { name: 'John' };
const boundFn = sayHello.bind(person);
boundFn('Hello'); // 출력: Hello John
3. apply
: apply
메서드는 함수를 호출하는 동시에 함수 내의 this
값을 설정하고, 인수를 배열로 전달합니다. apply
메서드는 첫 번째 인수로 전달된 객체가 함수 내의 this
값으로 설정되고, 두 번째 인수로 전달된 배열이 호출된 함수의 매개변수로 전달됩니다.
function sayHello(message) {
console.log(message, this.name);
}
const person = { name: 'John' };
sayHello.apply(person, ['Hello']); // 출력: Hello John
요약하자면, call
과 apply
는 함수를 호출하고 this
값과 인수를 설정하는 데 사용되며, bind
는 함수를 새로운 컨텍스트와 함께 묶어 새로운 함수를 생성합니다. call
과 apply
는 호출과 설정을 동시에 처리하고, bind
는 호출 대신 새로운 함수를 반환합니다.
apply() 함수는 call()과 비교하여 배열을 인자로 전달하는 이유는 다음과 같습니다:
1. 가변 인자 함수에 배열을 전달할 수 있음: JavaScript에서는 함수의 인자 개수가 고정되어 있지 않은 가변 인자 함수를 정의할 수 있습니다. apply()를 사용하여 배열을 전달하면 배열의 요소들이 함수의 가변 인자로 전달됩니다. 이는 함수가 얼마나 많은 인자를 받을지 알 수 없는 상황에서 유용합니다.
2. 함수의 인자를 동적으로 결정할 수 있음: apply()를 사용하여 함수를 호출할 때, 배열을 사용하여 인자를 동적으로 결정할 수 있습니다. 배열을 조작하거나 다른 방식으로 인자를 동적으로 생성한 후 apply()를 호출할 수 있습니다.
3. 기존 배열의 요소를 함수의 인자로 활용할 수 있음: 이미 배열로 데이터가 구성되어 있다면, apply()를 사용하여 해당 배열을 함수의 인자로 활용할 수 있습니다. 이는 코드의 가독성과 유지 보수를 향상시키는 데 도움이 될 수 있습니다.
따라서 apply() 함수는 배열 형태의 인자를 사용하여 함수를 호출할 수 있도록 함으로써, 가변 인자 함수를 다루거나 인자를 동적으로 결정하는 등의 유연성을 제공합니다.