자바스크립트에서 함수는 객체이다. 고로 메소드를 가질 수 있다.
apply 와 call 은 Function.prototype 의 메소드이다.
모든 함수객체는 Function.prototype 을 prototype 객체로 갖기 때문에
이 메소드를 사용하여 this 의 값을 선택할 수 있다.
◎ apply( this, [args] )
apply 메소드는 두개의 매개변수를 받는다.
첫번째는 this 에 바인딩할 값이며, 두번째는 실행할 함수에 넘겨줄 매개변수의 배열이다.
function mul(a,b){ return a * b; } var nums = [4,5]; var result = mul.apply(null, nums); // 20
위 코드에서는 this 의 값으로 null 을 전달함으로
자바스크립트의 암묵적인 this 바인딩에 영향을 주지 않았으며,
매개변수로 미리 작성한 nums 배열을 전달하여 계산이 이루어지도록 하였다.
함수 실행문맥의 this 를 선택할 수 있기 때문에
특정 객체의 메소드를 다른 객체를 대상으로 실행할 수 있다.
var Obj = function(name){ this.name = name; } Obj.prototype.getName = function(){ return this.name; } var otherObj = { name : "gamza" } Obj.prototype.getName.apply(otherObj); // gamza
◎ call( this, args... )
call 메소드는 기본적으로 apply 와 같으나,
this 값 이후의 매개변수를 배열로 받지 않고 나열하여 받는 차이점이 있다.
function mul(a,b){ return a * b; } var result = mul.apply(null, 4, 5); // 20