역동적 인 언어에 노출 된 적이없고 편집 된 언어 사고 방식에서 JavaScript를 이해한다면, 의식에서 불가능한 일이 일어나고, 심지어 불합리한 느낌이 들기 때문에 마법과 이상한 느낌을 받게 될 것입니다. 자유롭고 끝없는 언어 인 JavaScript를 배우는 과정 에서이 느낌을 만나면 현재 형태에서 "편견"을 놓아주십시오. 이것은 확실히 새로운 세상이기 때문에 JavaScript는 이전의 고형화 된 프로그래밍 의식을 천천히 녹여 새로운 활력을 주입하십시오!
좋아, 요점으로 돌아가서 먼저 Javascrtipt의 컨텍스트 특성을 동적으로 변환 된 런타임을 이해합니다. 이 특성은 주로 적용 및 호출 방법의 적용에 주로 반영됩니다.
적용을 구별하려면 한 문장으로 전화하십시오.
foo.call (this, arg1, arg2, arg3) == foo.apply (this, arguments) == this.foo (arg1, arg2, arg3)
호출 및 적용 둘 다 기능 메소드에 속합니다. 프로로 타입. JavaScript 엔진에 의해 본질적으로 구현됩니다. function.prototype, 각 함수 객체 인스턴스, 즉 각 메소드에는 호출 및 적용 속성이 있습니다. 그것은 방법의 속성이기 때문에 그들의 사용은 물론 방법을 목표로합니다. 이 두 가지 방법은 동일한 기능을 갖기 때문에 혼동하기 쉽지만 다르게 사용됩니다.
유사성 : 두 방법의 효과는 정확히 동일합니다.
차이점 : 방법으로 전달되는 매개 변수는 다릅니다
그렇다면 방법의 효과는 무엇이며 방법에 의해 전달되는 매개 변수는 무엇입니까?
위의 foo.call (this, arg1, arg2, arg3)을 분석합시다.
FOO는 메소드이며, 이는 메소드가 실행될 때 컨텍스트 관련 객체입니다. Arg1, Arg2 및 Arg3은 FOO 메소드로 전달되는 매개 변수입니다. 소위 컨텍스트 관련 객체 메소드가 실행되면 객체 지향 프로그래밍 기반이 있으면 이해하기 쉽습니다. 클래스 인스턴스화 후 객체에 있습니다.
JavaScript에서 코드에는 항상 컨텍스트 객체가 있으며 코드는이를 처리합니다. 컨텍스트 객체는이 변수에 의해 구현되며,이 변수는 항상 현재 코드가 위치한 객체를 가리 킵니다.
이것이 무엇인지 더 잘 이해하기 위해 예를 들어보십시오.
/클래스 A 기능 a () {// 클래스가 인스턴스화 될 때 다음 코드가 실행됩니다. // 현재 실행 컨텍스트 객체는 이것입니다. 이것은 현재 인스턴스 객체 this.message = "메시지의 메시지입니다. this.getMessage = function () {<span style = "white-space : pre"> </span> return this.message; <span style = "white-space : pre"> </span>}}} // 클래스 a a = new a (); // classe a = new a (); // calendate a calendate a. 클래스 B 함수 B () {this.message = "B의 메시지"; this.setMessage = function (msg) {<span style = "화이트 공간 : pre"> </span> this.message = msg; <span style = "화이트 공간 : pre"> </span>}} // 클래스 B 인스턴스 개체 생성 var a = new b ();클래스 A와 B에는 메시지 속성이 있음을 알 수 있습니다 (객체에 언급 된 멤버쪽으로). A는 메시지를 얻는 getMessage 메소드가 있으며 B는 메시지를 설정하는 SetMessage 메소드가 있습니다. 다음은 전화의 힘을 보여주는 것입니다.
// dynamic B의 setMessage 메소드를 객체 a에 할당합니다. 자체는이 방법이 없습니다! b.setmessage.call (a, "A의 메시지"); // 모든 표시 "A의 메시지"alert (a.getMessage ()); // 동적 a의 getMessage 메소드를 객체에 할당 b. B 자체는이 방법이 없습니다!
이것이 동적 언어 JavaScript 호출의 힘입니다!
그것은 단순히 "아무것도 아닌 것을 만드는 것"입니다. 객체의 메소드는 임의로 할당 할 수 있지만 객체 자체에는이 방법이 없었습니다. 과제입니다. 평신도의 용어에 따르면이 방법은 작업을 완료하기 위해 다른 개체를 빌려주는 것입니다. 원칙적으로, 메소드가 실행될 때 컨텍스트 객체가 변경됩니다.
따라서 B.setmessage.call (A, "A의 메시지"); 실행할 때 B 객체의 setMessage 메소드를 호출하는 컨텍스트 객체를 사용하는 것과 동일하며,이 과정은 b와 관계가 없으며 그 효과는 a.setmessage ( "a 's message")와 동일합니다.
적용 및 전화의 효과는 동일하기 때문에
전화, 적용 기능은 자신의 전화와 마찬가지로 다른 사람들의 방법을 빌릴 것입니다.
자, 통화와 적용의 유사성을 이해 한 후 - 이해 한 후에는 차이점을 살펴 보겠습니다. 위의 예를 살펴본 후, 나는 당신이 그것에 대해 알고 있다고 생각합니다.
B.setMessage.call (A, "A의 메시지")에서 A.SetMessage ( "A의 메시지")와 동일합니다. "A의 메시지"가 호출에서 매개 변수로 전달된다는 것을 알 수 있습니다.
그렇다면 적용의 의미는 무엇입니까? 명확하게 설명하기가 어렵습니다. 적용은 응용 프로그램 시나리오와 결합해야합니다. 응용 프로그램 시나리오를 설계하겠습니다.
함수 print (a, b, c, d) {alert (a + b + c + d);} 함수 예제 (a, b, c, d) {// 호출 메소드에서 인쇄를 대출하고 Pass Print.call (a, a, b, b, c, d); // Arther in j -jere, // j -the j -the avas in j -the avations in a arly at a jop in a arly at here in a print.call (a, b, b, c, d); 메소드 직접 print.Apply (this, arguments); // 또는 배열 인쇄로 캡슐화하십시오 (this, [a, b, c, d]);} // "백라이트 스크립트"예제 ( "back", "light", "foot", "this"););이 시나리오에서, 예제 방법에서, a, b, c, d는 메소드에 의해 전달되는 매개 변수로 사용되며, 방법을 사용하여 호출 할 인쇄 방법을 빌려야한다.
마지막 문장에서 예제 메소드가 직접 호출 되므로이 메소드의 컨텍스트 객체는 창 객체입니다.
따라서, 첫 번째 매개 변수를 제외하고, 즉, 컨텍스트 객체는 실행시 동일하며, 호출 메소드의 다른 매개 변수는 차례로 매개 변수로 빌린 메소드로 전달되며, 적용은 두 개의 매개 변수가 있고 두 번째 매개 변수는 배열로 전달됩니다. 그래서 그것은 말할 수 있습니다
통화와 적용 방법의 차이점은 두 번째 매개 변수에서 시작하여 호출 메소드 매개 변수가 차례로 매개 변수로 빌린 메소드로 전달되며,이 매개 변수를 배열에 직접 넣은 다음 전달한다는 것입니다. 마지막으로, 빌린 방법의 매개 변수 목록은 동일합니다.
응용 프로그램 시나리오 :
매개 변수가 명확한 경우 호출을 사용할 수 있으며 매개 변수가 불분명 할 때 인수를 사용할 수 있습니다.
// print.call (창, "뒤로", "빛", "풋", "this"); // foo 매개 변수는 여러 함수 일 수 있습니다. foo () {<span style = "white space : pre"> </span> print.Apply (창, 인수);}위의 기사는 JavaScript의 apply ()와 Call () 메소드의 차이를 깊이 이해합니다. 내가 당신과 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.