우선, 함수가 정의 될 때이 포인팅을 결정할 수 없다고 말해야합니다. 함수가 실행될 때만이 시점이 누구인지에 대해서는이 점이있을 수 있습니다. 사실, 이것은 궁극적으로 그것을 부르는 객체를 가리 킵니다 (이 문장에는 몇 가지 문제가 있으며 나중에 문제가있는 이유를 설명 할 것입니다. 인터넷의 대부분의 기사에서는 이것을 말하지만, 많은 경우에 그것을 이해하는 데 아무런 문제가 없지만 실제로 이해하는 것은 부정확하므로 이해할 때 이해할 수 없다고 느낄 것입니다). 그런 다음 다음 에이 문제에 대해 깊이 논의 할 것입니다.
왜 이것을 배우나요? 기능 프로그래밍 및 객체 지향 프로그래밍을 배운 경우 어떻게 해야하는지 알아야합니다. 당신이 그것을 배우지 않았다면, 당신은 당분간이 기사를 읽을 필요가 없습니다. 물론 관심이 있으시면 읽을 수도 있습니다. 결국, 이것은 JS에서 마스터 해야하는 것입니다.
Example 1:
함수 a () {var user = "little j"; Console.log (this.user); // 정의되지 않은 console.log (this); // Window} a ();우리가 위에서 말한 바에 따르면, 이것은 궁극적으로 그것을 부르는 물체를 가리 킵니다. 여기의 기능은 실제로 창 객체에 의해 지적되며 다음 코드는이를 증명할 수 있습니다.
함수 a () {var user = "little j"; Console.log (this.user); // 정의되지 않은 console.log (this); } window.a () // 창위의 코드와 마찬가지로 Alert는 실제로 창의 속성이며 창으로 지적됩니다.
Example 2:
var o = {user : "chasing dreams", fn : function () {console.log (this.user); // dreams}} o.fn ();이것은 여기에서 객체 O를 가리 킵니다.이 fn을 호출하고 o.fn ()을 통해 실행하기 때문에 자연스럽게 포인팅은 객체 O입니다. 이 포인팅이 함수가 생성 될 때 결정할 수 없으며 호출 될 때만 결정할 수 있음을 다시 강조하고 싶습니다. 그것을 부르는 사람은 누구든지 누구에게 지적 할 것입니다. 당신은 이것을 알아 내야합니다.
실제로, 예 1과 예제 2는 충분히 정확하지 않습니다. 다음 예는 위의 이론을 뒤집을 수 있습니다.
이것을 철저히 이해하려면 다음 몇 가지 예를 살펴 봐야합니다.
Example 3:
var o = {user : "잡기 꿈", fn : function () {console.log (this.user); // 잡는 꿈}} window.o.fn ();이 코드는 위 코드와 거의 동일하지만 왜 이것이 창을 가리키는가? 위의 이론을 따르는 경우,이 점은 그것을 부르는 대상으로. 여기에 다른 말을하겠습니다. Windows는 JS의 글로벌 객체입니다. 우리가 만든 변수는 실제로 창에 속성을 추가하므로 창을 사용하여 O 객체를 여기에 가리킬 수 있습니다.
위 의이 코드가 왜 창을 가리키지 않는지 설명하지 않습니다. 다른 코드를 봅시다.
var o = {a : 10, b : {a : 12, fn : function () {console.log (this.a); // 12}}} obfn ();이것은 또한 Object O에 의해 지적되지만, 이것은 그것을 실행하지 않기 때문에, 당신은 처음에 내가 말한 것이 모두 잘못되었다고 말할 것입니까? 사실, 처음에는 부정확 한 것이 아닙니다. 다음으로 한 문장을 추가하겠습니다. 나는 당신이 이것이 지적한 문제를 철저히 이해할 수 있다고 생각합니다.
============================================================================================
사례 1 : 함수에 이것이 있지만 이전 레벨의 객체에 의해 호출되지 않으면 창을 가리 킵니다. 여기서 설명해야 할 것은 엄격한 버전의 JS에서 창을 가리키지 만 여기에서 엄격한 버전의 문제에 대해서는 논의하지 않을 것입니다. 알고 싶다면 직접 온라인으로 검색 할 수 있습니다.
============================================================================================
사례 2 : 기능 에이 기능이 있고이 함수가 이전 레벨의 객체에 의해 호출되면 이전 레벨의 객체를 가리 킵니다.
============================================================================================
사례 3 : 기능 에이 기능이 있으면이 기능에는 여러 객체가 포함됩니다. 이 함수는 가장 바깥 쪽 객체에 의해 호출되지만 이것은 다음 레벨의 물체 만 가리 킵니다. 예 3은 당신이 그것을 믿지 않으면 다음 몇 가지 예를 계속 살펴 보겠습니다.
var o = {a : 10, b : {// a : 12, fn : function () {console.log (this.a); // undefined}}} obfn ();객체 B에는 속성 A가 없지만이 객체에 원하는 것이 있는지 여부에 관계없이 이전 객체를 가리키기 때문에 객체 B를 가리 킵니다.
또 다른 특별한 경우, 예 4 :
var o = {a : 10, b : {a : 12, fn : function () {console.log (this.a); // 정의되지 않은 console.log (this); // Window}}} var j = obfn; j ();이것은 여기서 창을 지적합니다. 약간 혼란스럽지 않습니까? 사실, 그것은 당신이 문장을 이해하지 못하기 때문입니다.
이것은 항상 그것을 마지막으로 부르는 객체를 가리 킵니다. 이는 그것이 실행될 때 그것을 부르는 사람을 의미합니다. 실시 예 4에서는 함수 FN이 객체 B에 의해 참조되지만 FN을 변수 j에 할당 할 때 실행되지 않으므로 궁극적으로 Window를 가리 며 예 3과 다릅니다. 예제 3은 FN을 직접 실행합니다.
이것은 실제로 그다지지만, 포인팅은 다른 상황에서 다를 것입니다. 위의 요약은 각 장소에서 약간의 실수이며 실수라고 말할 수는 없지만 상황은 다른 환경에서 다를 것이므로 한 번에 명확하게 설명 할 수 없으므로 천천히 경험할 수 있습니다.
생성자 버전 :
함수 fn () {this.user = "small j";} var a = new fn (); console.log (a.user); // 작은 jObject A가 여기에서 FN에서 사용자를 지적 할 수있는 이유는 새 키워드가 이것의 방향을 변경하고이를 객체 a로 지적 할 수 있기 때문입니다. 내가 왜 대상이라고 말합니까? 새 키워드를 사용하는 것은 객체 인스턴스를 만드는 것입니다. 이 문장을 이해하면 예제 3을 생각할 수 있습니다. 변수 A를 사용하여 FN 인스턴스를 생성합니다 (FN을 객체 A에 복사하는 것과 동일). 현재, 그것은 방금 만들어지고 실행되지 않습니다. 이 함수 fn에 대한 호출은 객체 a이므로 자연스럽게 객체 a입니다. 그렇다면 왜 Object FN에 사용자가 있습니까? FN 함수를 Object A에 복사했으며 새 키워드를 사용하는 것은 사본을 복사하는 것과 같습니다.
위의 것 외에도, 우리는 이것의 방향을 스스로 변경할 수 있습니다 ======== >>> 전화, 적용, 바인딩
이 만남이 돌아 오면 작은 문제를 업데이트하십시오
함수 fn () {this.user = 'small j'; 반품 {}; } var a = 새로운 fn; Console.log (A.user); //한정되지 않은다른 것을보세요
함수 fn () {this.user = 'small j'; return function () {};} var a = new fn; Console.log (A.user); //한정되지 않은다시 오세요
함수 fn () {this.user = 'small j'; 반환 1;} var a = 새로운 fn; Console.log (A.user); // small jfunction fn () {this.user = 'small j'; return undefined;} var a = new fn; Console.log (A.user); // 작은 j리턴 값이 객체 인 경우 리턴 된 객체를 가리 킵니다. 리턴 값이 객체가 아닌 경우 여전히 함수 인스턴스를 가리 킵니다.
함수 fn () {this.user = 'small j'; return undefined;} var a = new fn; Console.log (a); // fn {user : "small j"}또 다른 요점은 Null이 객체이기도하지만 Null은 더 특별하기 때문에 여전히 해당 기능의 인스턴스를 가리 킵니다.
함수 fn () {this.user = 'small j'; return null;} var a = 새로운 fn; Console.log (A.user); // 작은 j보충 지식 요점 :
1. 기본 버전의 기본값은 더 이상 창이 아니라 정의되지 않았습니다.
2. 새 연산자는 기능의 포인팅 문제를 변경합니다. 우리는 위에서 설명했지만이 문제에 대해 깊이 논의하지 않았습니다. 인터넷에서는 거의 언급되지 않았으므로 여기에서 이야기해야합니다.
함수 fn () {this.num = 1;} var a = new fn (); console.log (a.num); // 1이 점이 왜 A를 가리키나요? 먼저 새 키워드가 빈 객체를 생성 한 다음 기능 적용 메소드가 자동으로 호출 되어이 빈 객체를 가리 킵니다. 이러한 방식으로 기능 내부는이 빈 객체로 대체됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.