자바스크립트의 함수를 실행하는 방법은 아래와 같습니다. 예를들어 아래와 같이 show라는 이름의 함수가 있다면? show()라고 소괄호를 실행합니다.

function show(name) { return name; }
// 함수 실행

show('webisfree')

이때 함수 또는 객체 내부의 함수인 메소드를 실행하는 방법으로 call(), apply()를 사용할 수 있습니다. 그럼 call()과 apply()는 언제 그리고 어떻게 사용할까요?



# 함수에서 apply(), call()를 사용하는 이유이 둘을 사용하는 이유를 먼저 알아봅니다. 함수가 실행될때 내부 콘텍스트의 this는 실행중인 객체 자신을 가리키거나 객체 내부의 함수가 아니라면 window 객체를 가리킬 것입니다. 이때 this가 가리키는 대상을 바꿀 수 있는데 이때 this값을 조작하는데 사용하는 방법이 바로 call()과 apply()입니다.


! call() apply() 사용방법@ call() 사용 방법

함수.call(지정할 객체명, 전달할 매개변수)



@ apply() 사용 방법

함수.apply(지정할 객체명, [전달할 매개변수])


call()과 apply()는 동일하게 this 키워드가 가리키는 대상을 변경할 수 있게해줍니다. 단지 인자를 전달하는 방법에서 작은 차이가 있습니다. 그럼 먼저 call()에 대하여 알아보도록 하겠습니다. 아래 예제를 참고해주세요.




# call()을 사용한 방법 예제보기아래 에제는 객체 obj1 그리고 obj2가 있습니다. 둘 다 getName이라는 함수를 가지고 있는데 만약 obj1에서 getName() 함수를 실행할 경우 함수 내부의 this가 obj2를 가리키도록 바꾸려면 어떻게할까요?
obj1 = {
  name: 'WEB',
  getName: function() {
    return this.name;
  }
};

obj2 = {
  name: 'FREE',
  getName: function() {
    return this.name;
  }
};

이제 obj1.getName()을 실행해보겠습니다.
obj1.getName();
'WEB' // this가 obj1을 가리킴

이제 call()을 사용하여 this 키워드가 obj2를 가리키도록 변경해봅니다.
obj1.getName.call(obj2);
'FREE' // this가 obj2를 가리킴

이처럼 내부 콘텍스트의 this값이 지정한 obj2로 바꾸어 다른 값이 출력되게됩니다.

라이브러리 등에서 call() 또는 apply()를 사용하면 스코프 체인을 우회하는데도 사용됩니다. 그렇다면 아래는 apply()를 사용하는 방법입니다.



# 또 다른 예제보기, apply(), call()위 예제는 전달할 인자가 없으므로 call(), apply() 동일합니다. 인자를 전달하는 경우라면? 아래와 같이 예제를 만들 수 있습니다.
obj3 = {
  sum: function(a, b) {
    return a + b;
  }
};

이제 위 객체의 메소드 sum()을 실행해봅니다. 먼저 일반적인 방법입니다. 그 후에 call(), apply()를 각각 사용하여봅니다.
obj3.sum.call(null, 1, 2);
// 3을 출력

obj3.sum.apply(null, [1, 2]);
// 3을 출력

결과는 역시 동일합니다. 다만 인자(arguments)를 전달하는 방법에 차이가 있습니다.