November 03, 2019
JavaScript의 call과 apply는 함수를 호출하는데 사용되는 메소드이다.
더 자세히 알아보기 전에 먼저 함수의 기본적인 호출 방법에 대해 알아보자.
function sum (arg1, arg2) {
return arg1 + arg2;
}
console.log(sum(2, 3)); // 5
sum
이라는 함수에 매개변수로 두 개의 값을 받고 있으므로 이 함수를 호출할 때 sum(2, 3)
과 같은 방식으로 호출할 수 있다. 이 때 함수의 리턴값은 5
다.
그렇다면 이제 call과 apply로 함수를 호출하는 방법에 대해 알아보자.
call과 apply는 지원되는 인수의 타입만 제외하면 매우 유사하지만 apply는 인수(파라미터)의 리스트 대신 인수들의 배열을 사용할 수 있다. 배열 리터럴이나 Array 객체를 사용할 수 있다.
func.apply(this, ['eat', 'bananas'])
func.apply(this, new Array('eat', 'bananas'))
function sum (arg1, arg2) {
return arg1 + arg2;
}
console.log(sum(2, 3)); // 5
console.log(sum.call(this, 2, 3)); // 5
console.log(sum.apply(this, [2, 3])); // 5
기본적으로 Function 객체는 call과 apply 메소드를 가지고 있는데 sum
도 Function 객체의 인스턴스이기 때문에 call과 apply를 호출할 수 있다.
call과 apply는 비슷하지만 매개변수를 전달하는 방식이 다르다.
arguments 객체를 그대로 전달해도 되거나 매개변수로 전달할 데이터가 이미 배열 형태로 준비되어 있다면 apply가 나을 것이고 그렇지 않다면 call이 나을 것이다.
그런데 왜 굳이 call과 apply와 같은 방식을 사용하여 함수를 호출해야 하는가?
1 2 3 4 5 6 7 8 9 10 11 12 13 | o1 = { val1: 1, val2: 2, val3: 3 }; o2 = { v1: 10, v2: 50, v3: 100, v4: 25 }; function sum () { var _sum = 0; for (name in this) { _sum += this[name]; } return _sum; } console.log(sum.apply(o1)); // 6 console.log(sum.apply(o2)); // 185 | cs |
sum
을 객체 o1
의 메소드로 만들고 sum
을 호출한다. 이렇게 되면 (줄 4~10)의 함수 sum
안에 있는 this
는 객체 o1
을 뜻하게 되는 것이다.sum
안에서 반복문을 돌면서 객체 o1
의 키값들 val1, val2, val3
이 차례대로 name
이라는 값으로 들어가게 되며 this[name]
의 값은 해당 키값의 value
들을 말한다. 그래서 차례대로 1, 2, 3
이 더해져 6
이라는 결과가 나온 것이다.sum.apply(o2)
도 이와 같은 방식으로 185
라는 결과가 나온다.1 2 3 4 5 6 7 8 9 10 11 12 13 14 | window.title = "WINDOW"; var obj = { title : "OBJECT" }; function func() { console.log(this.title); }; func(); // WINDOW func.call(this); // WINDOW func.call(obj); // OBJECT func.apply(this); // WINDOW func.apply(obj); // OBJECT | cs |
func
함수 내의 this
는 window
객체를 가리키기 때문에 window.title
인 WINDOW
가 출력된다.this
를 넘겼다. 여기서 this
는 window
객체를 가리키기 때문에 함수 func
는 window
의 메소드가 되는 것이다. 따라서 func
내의 this
는 window
객체를 가리키기 때문에 window.title
인 WINDOW
가 출력된다.obj
객체를 넘겼다. 따라서 함수 func
는 obj
객체의 메소드가 되기 때문에 func
내의 this
는 obj
객체를 가리키므로 obj.title
인 OBJECT
가 출력된다.func.call(this)
와 같은 원리로 WINDOW
가 출력된다.func.call(obj)
와 같은 원리로 OBJECT
가 출력된다.