1. call
call method
현재 객체를 다른 객체로 대체하기 위해 객체의 메소드를 호출합니다.
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
매개변수
thisObj
선택 사항. 현재 객체로 사용될 객체입니다.
arg1, arg2, , argN
선택 사항. 일련의 메소드 매개변수가 전달됩니다.
설명
call 메소드는 다른 객체 대신 메소드를 호출하는 데 사용할 수 있습니다. call 메소드는 함수의 객체 컨텍스트를 초기 컨텍스트에서 thisObj가 지정한 새 객체로 변경합니다.
thisObj 매개변수가 제공되지 않으면 전역 개체가 thisObj로 사용됩니다.
간단한 예(함수 호출):
function add(a,b) { alert(a+b); } function sub(a,b) { alert(a-b); } add.call(sub,3,1);
이 예의 의미는 sub를 add, add.call(sub,3,1) == add(3,1) 로 바꾸는 것입니다. 실행 결과는 다음과 같습니다. 더 복잡한 예(메서드 호출):
function Class1() { this.name = "class1"; this.showNam = function() { alert(this.name); } } function Class2() { this.name = "class2"; } var c1 = new Class1(); var c2 = new Class2(); c1.showNam.call(c2);
호출은 실행을 위해 c1의 메서드를 c2에 넣는 것을 의미합니다. showNam.() 메서드가 있으면 이제 c2에 c1의 showNam() 메서드를 넣어 실행하므로 this.name은 class2여야 하며 실행 결과는 다음과 같습니다. >
function Class1() { this.showTxt = function(txt) { alert(txt); } } function Class2() { Class1.call(this); } var c2 = new Class2(); c2.showTxt("cc");
다중 상속
function Class10() { this.showSub = function(a,b) { alert(a-b); } } function Class11() { this.showAdd = function(a,b) { alert(a+b); } } function Class2() { Class10.call(this); Class11.call(this); }
이 두 가지 방법은 기본적으로 동일한 의미입니다.
차이점은 2번째 매개변수입니다. call은 모든 유형이 가능하며 Apply 두 번째 매개변수는 배열이어야 합니다.
2. Apply
는 Apply와 Call의 기능이 동일하지만 둘 사이에는 매개변수에 차이가 있습니다.
첫 번째 매개변수의 의미는 동일하지만 두 번째 매개변수의 경우
apply는 매개변수 배열로 전달됩니다. 즉, 여러 매개변수를 배열로 결합하여 전달하며, call은 호출로 사용됩니다. 매개변수가 전달됩니다(두 번째 매개변수부터 시작).
예를 들어 func.call(func1,var1,var2,var3)의 해당 Apply 작성 방법은 다음과 같습니다. func.apply(func1,[var1,var2,var3])
팁(코드 우아하고 실행효율이 높음)
alert(Math.max(5,8)) //8 alert(Math.max(5,7,9,3,1,6)) //9 var arr=[5,7,9,1] alert(Math.max.apply(null,arr));