동적 언어를 접해본 적이 없다면, 컴파일된 언어의 사고 방식으로 JavaScript를 이해하는 것이 마술적이고 이상하게 느껴질 것입니다. 왜냐하면 의식적으로 불가능한 일이 종종 일어나기 때문이며, 학습을 하다 보면 심지어 불합리하다고 느낄 수도 있습니다. 자유롭고 끊임없이 변화하는 언어인 자바스크립트를 사용하는 과정에서 이런 느낌을 받게 된다면, 이제부터 여러분의 '선입견'을 내려놓으시기 바랍니다. 이곳은 분명 여러분에게 신대륙이기 때문입니다. 좋아요, 더 이상 이야기하지 않겠습니다. 먼저 적용 및 호출 방법의 정의를 설명하겠습니다.
구체적인 내용은 다음과 같습니다.
1. 메소드 정의
call과 apply는 모두 JavaScript 엔진에 의해 내부적으로 구현되는 Function.prototype의 메소드에 속하므로 각 Function 객체 인스턴스, 즉 각 메소드에는 call과 apply 속성이 있습니다. 메소드의 속성으로서 이들의 사용은 물론 메소드에 따라 다릅니다. 이 두 메소드는 동일한 기능을 갖고 있지만 서로 다른 방식으로 사용되기 때문에 혼동하기 쉽습니다.
통화 방법:
구문: call([thisObj[,arg1[, arg2[, [,.argN]]]]])
설명:
호출 메소드는 다른 객체를 대신하여 메소드를 호출하는 데 사용될 수 있습니다. call 메소드는 함수의 객체 컨텍스트를 초기 컨텍스트에서 thisObj가 지정한 새 객체로 변경합니다.
신청방법 :
구문: apply([thisObj[,argArray]])
argArray가 유효한 배열이 아니거나 인수 객체가 아닌 경우 TypeError가 발생합니다.
전화 신청 기능은 내 전화처럼 다른 사람의 전화 방법을 빌려주는 것입니다.
차이점:
적용: 최대 두 개의 매개변수만 있을 수 있습니다. 즉, 새로운 this 객체와 배열 argArray입니다. 이 메소드에 여러 매개변수가 전달되면 모든 매개변수가 이 배열에 기록됩니다. 물론 매개변수가 하나만 있어도 배열에 기록됩니다. argArray가 유효한 배열이 아니거나 인수 객체가 아닌 경우 TypeError가 발생합니다. argArray나 thisObj가 모두 제공되지 않으면 전역 개체가 thisObj로 사용되며 매개 변수를 전달할 수 없습니다.call: 직접 매개변수 목록으로, 현재 this 인스턴스 포인터를 일관되게 유지하거나 특별한 상황에서 이 포인터를 변경하기 위해 js 객체의 다양한 메서드가 서로 호출할 때 주로 사용됩니다. thisObj 매개변수가 제공되지 않으면 Global 개체가 thisObj로 사용됩니다.
더 쉽게 말하면 apply와 call의 기능은 동일하지만 전달되는 매개변수 목록의 형식이 다릅니다. 예를 들어 func.call(func1,var1,var2, var3)은 다음과 같습니다.
func.apply(func1,[var1,var2,var3])
add.apply(sub,[3,1]); //add.call(sub,3,1); var a={ n:1, m:2, add:function(){ return this.n+this.m; } } var b={n:3,m:4 } console.log(a.add.call(b));//b.n+b.m=7 function Animal(){ this.name = "Animal"; this.showName = function(){ alert(this.name); } } function Cat(){ this.name = "Cat"; } var animal = new Animal(); var cat = new Cat(); //通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。 //输入结果为"Cat" animal.showName.call(cat,","); animal.showName.apply(cat,[]);