October 15, 2021
자바스크립트는 함수를 다룰 때 탁월한 유연성을 제공합니다. 함수는 이곳저곳 전달될 수 있고, 객체로도 사용될 수 있습니다. 이번 챕터에선 함수 간에 호출을 어떻게 포워딩(forwarding) 하는지, 함수를 어떻게 데코레이팅(decorating) 하는지에 대해 알아보겠습니다.
https://ko.javascript.info/call-apply-decorators
먼저, this
를 명시적으로 고정해 함수를 호출할 수 있게 해주는 특별한 내장 함수 메서드 func.call(context, …args)에 대해 알아봅시다.
문법은 다음과 같습니다.
func.call(context, arg1, arg2, ...)
메서드를 호출하면 메서드의 첫 번째 인수가 this
, 이어지는 인수가 func
의 인수가 된 후, func
이 호출됩니다.
아래 함수와 메서드를 호출하면 거의 동일한 일이 발생합니다.
다른 컨텍스트(다른 객체) 하에 sayHi
를 호출하는 예시를 살펴봅시다. sayHi.call(user)
를 호출하면 sayHi
의 컨텍스트가 this=user
로, sayHi.call(admin)
을 호출하면 sayHi
의 컨텍스트가 this=admin
로 설정됩니다.
function sayHi() {
alert(this.name);
}
let user = { name: "John" };
let admin = { name: "Admin" };
// call을 사용해 원하는 객체가 'this'가 되도록 합니다.
sayHi.call( user ); // this = John
sayHi.call( admin ); // this = Admin
그런데 여기서 func.call(this, ...arguments)
대신, func.apply(this, arguments)
를 사용해도 됩니다.
내장 메서드 func.apply의 문법은 다음과 같습니다.
func.apply(context, args)