호출 및 적용의 첫 번째 실제 매개변수는 호출할 함수의 상위 객체이며, 이는 호출 컨텍스트입니다. 이에 대한 참조는 함수 본문에서 이를 통해 얻어집니다.
예를 들어 객체 o의 메소드로 f 함수를 호출하려는 경우 다음과 같이 호출 및 적용 메소드를 사용할 수 있습니다.
f.call(o);
f.apply(o);
가능
o.m = f; / f를 o 임시 메서드로 저장
o.m(); // 이 임시 메서드 호출
delete o.m; // 이 임시 메서드 삭제
예를 들어보겠습니다.
function testFun(){
return this.a this.b;
}
var o = {a:1, b:2};
testFun.call(o) //3
testFun.apply(o); //3
위 코드의 실행 결과는 모두 3인데, return o.a o.b로 이해하면 됩니다.
호출 및 적용 메서드의 첫 번째 실제 매개변수가 null이거나 정의되지 않은 경우 어떻게 될까요? 다음 예를 살펴보겠습니다.
var a = 10, b = 20;
function testFun(){
return this.a this.b;
}
testFun.call();
testFun.apply();
위 코드 실행 결과는 모두 30개 입니다. 호출 및 적용의 첫 번째 실제 매개변수가 null 또는 정의되지 않은 상태로 전달되면 전역 개체로 대체되기 때문입니다.
호출과 적용 두 메소드의 차이점은 무엇인가요?
호출 메소드의 경우 첫 번째 호출 컨텍스트 매개변수 이후의 실제 매개변수는 모두 호출할 함수에 전달되는 값입니다. 예를 들어 함수 f를 객체 o의 메서드로 호출하고 두 개의 매개변수를 전달하려면 다음 코드를 사용할 수 있습니다.
f.call(o, 1, 2);
적용 메소드는 첫 번째 실제 매개변수 이후의 모든 실제 매개변수를 적용합니다. 배열에 담아
f.apply (o, [1, 2]);
예를 들어보겠습니다
function testFun(x, y){
return this.a this.b x y;
}
var o = {a:1, b: 2};
testFun.call(o, 10, 20);
testFun.apply(o, [10, 20]);
위 코드의 실행 결과는 다음과 같습니다. 33, 이는 return o.a o.b 10 20으로 이해될 수 있습니다.