call, apply, bind의 차이점

call, apply, 그리고 bind는 JavaScript에서 함수를 호출하거나 함수의 컨텍스트를 변경하는 데 사용되는 메서드들이다. 모두 함수 호출과 관련된 작업을 수행하지만 차이점이 있다.

call:

  • 함수를 호출하는 동시에 특정 컨텍스트(this)와 필요한 매개변수를 제공
  • 함수 내부에서 this가 특정 객체를 참조하도록 설정
function greet(name) {
  console.log(`Hello, ${name}! I'm ${this.job}.`)
}
 
const person = {
  job: 'developer'
}
 
greet.call(person, 'Alice') // Output: Hello, Alice! I'm developer.

apply:

  • call과 유사하지만, 매개변수를 배열로 전달
  • 함수의 매개변수가 배열로 제공되며, 배열의 각 요소가 함수의 매개변수로 대응
function multiply(a, b) {
  return a * b
}
 
console.log(multiply.apply(null, [5, 3])) // Output: 15

bind:

  • 함수의 컨텍스트(this)를 영구적으로 바인딩하기 위해 사용
  • 새로운 함수가 생성되며, 기존 함수의 컨텍스트는 유지
const person = {
  name: 'Alice',
  greet: function () {
    console.log(`Hello, I'm ${this.name}.`)
  }
}
 
const sayHello = person.greet
const sayHelloBound = person.greet.bind(person)
 
sayHello() // Output: Hello, I'm undefined. (컨텍스트 손실)
sayHelloBound() // Output: Hello, I'm Alice. (bind로 컨텍스트 고정)

위의 예시에서 sayHello 함수는 컨텍스트를 잃어버려서 undefined를 출력하지만, bind를 사용하여 sayHelloBound 함수는 person 객체와 함께 호출되어 정상적인 결과를 출력한다.