on
apply 함수의 호출
apply
함수를 호출하는 가장 기본적인 방법
function func(){
}
func();
JavaScript는 함수를 호출하는 특별한 방법을 제공한다. 함수 func
는 Function
이라는 객체의 인스턴스다.
따라서 func
는 객체 Function
이 가지고 있는 메소드들을 상속하고 있다.
해당 포스트에서 이야기하려는 메소드는 Function.apply
과 Function.call
이다.
function sum(arg1, arg2){
return arg1+arg2;
}
alert(sum.apply(null, [1,2]))
함수 sum
은 Function
객체의 인스턴스다.
그렇기 때문에 객체 Function
의 메소드 apply
를 호출 할 수 있다.
apply
메소드는 두개의 인자를 가질 수 있는데, 첫번째 인자는 함수(sum
)가 실행될 맥락이다.
두번째 인자는 배열인데, 이 배열의 담겨있는 원소가 함수(sum
)의 인자로 순차적으로 대입된다.
(그래서 apply
는 인자를 얼마 넣을 지 모를때 주로 사용한다.)
apply 사용
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;
}
alert(sum.apply(o1)) // 6
alert(sum.apply(o2)) // 185
두개의 객체를 만들었다.
o1
는 3개의 속성을 가지고 있다. 각각의 이름은 val1
, val2
, val3
이다.
o2
는 4개의 속성을 가지고 있고 o1
과는 다른 속성 이름을 가지고 있고 속성의 수도 다르다.
그 다음엔 함수 sum
을 만들었다.
이 함수는 객체의 속성을 열거할 때 사용하는 for in 문을 이용해서 객체 자신(this)의 값을 열거한 후에 각 속성의 값을 지역변수 _sum
에 저장한 후에 이를 리턴하고 있다.
객체 Function
의 메소드 apply
의 첫번째 인자는 함수가 실행될 맥락이다.
sum.apply(o1)
은 함수 sum을 객체 o1
의 메소드로 만들고 sum
을 호출한 후에 sum
을 삭제한다. (안그러면 sum
함수의 내용도 다 더해버리니까..)
아래와 비슷하다. (실행결과가 조금 다르다. 그것은 함수 for in문으로 객체 o1
의 값을 열거할 때 함수 sum
도 포함되기 때문이다.)
o1.sum = sum;
alert(o1.sum());
delete o1.sum();
sum
이 o1
소속의 메소드가 된다는 것은 함수 sum
에서 this
의 값이 전역객체가 아니라 o1
이 된다는 의미다. (sum
의 this = o1
)
일반적인 객체지향 언어에서는 하나의 객체에 소속된 함수는 그 객체의 소유물이 된다.
하지만 JavaScript에서 함수는 독립적인 객체로서 존재하고, apply
나 call
메소드를 통해서 다른 객체의 소유물인 것처럼 실행할 수 있다.
만약 apply
의 첫번째 인자로 null
을 전달하면 apply
가 실행된 함수 인스턴스는 전역객체(브라우저에서는 window
)를 맥락으로 실행되게 된다.
Discussion and feedback