우리는 한 문장을 기억해야 합니다. 이것은 항상 함수가 실행되는 객체를 가리킵니다! 함수가 생성된 개체가 아니라 기억하세요...
이 기사에서는 세 가지 상황에서 이 개체가 어디에 있는지 분석합니다.
일반 함수에 있는 이
이것이 어디에 있든 함수가 실행될 때 위치를 찾는 것이 최우선입니다.
1 var name="global";
2 함수 getName(){
3 var name="local";
4 return this.name;
5 };
6 Alert(getName());
글로벌 환경의 getName 함수에 나타날 때 getName 함수의 런타임 위치는
alert(getName());
분명히 getName 함수가 위치한 객체는 전역 객체, 즉, 창문이므로 이 집은 창문 안에 있어야 합니다. 이때 this는 window 객체를 가리키므로 getName이 반환한 this.name은 실제로는 window.name이므로 경고가 "global"로 나옵니다!
그렇다면 이것이 지구환경의 기능으로 나타나지 않고 지역환경의 기능으로 나타난다면 어디로 떨어질 것인가?
1 var name="global";
2 var twobin={
3 이름:"local",
4 getName:function(){
5 return this.name;
6 }
7 };
8 Alert( twobin.getName());
이것이 위치한 getName 함수는 글로벌 환경이 아닌 twobin 환경에 있습니다. 이것이 어디에 있든 간에, 기능이 실행될 때 위치를 찾아야 합니다. 이때 getName 함수 실행시 위치
alert(twobin.getName());
분명히 getName 함수가 위치한 객체는 twobin이므로 이것의 홈은 twobin에 있어야 합니다. twobin 객체에 대한 경우 getName이 반환한 this.name은 실제로 twobin.name이므로 경고는 "부분"으로 표시됩니다!
이것이 클로저입니다
클로저도 문제가 됩니다. 이 글에서는 당분간 이에 대해 자세히 다루지 않겠습니다. 즉, 소위 클로저라는 것은 함수 내부에 또 다른 함수를 만드는 것입니다. 외부 변수에 액세스합니다.
탕자 이것이 악당 폐쇄와 뒤섞여 있으면 결코 평화가 없을 것이 분명합니다!
1 var name="global";
2 var twobin={
3 이름:"local",
4 getName:function(){
5 return function(){
6 return this.name;
7 } ;
8 }
9 };
10 Alert(twobin.getName()());
이때 분명히 문제가 있는 것 같은데 실제로는 getName 함수의 익명 함수 내에서 익명 함수는 변수 이름을 호출하여 클로저를 형성합니다. 즉, 이것이 클로저에 있습니다.
어디든, 기능이 실행될 때 위치를 꼭 찾아보세요. 이때 getName 함수의 런타임 위치를 기준으로 판단할 수 없고 익명 함수의 런타임 위치를 기준으로 판단합니다.
함수(){
return this .name;
};
분명히 익명 함수가 위치한 객체는 window이므로 이 객체의 홈은 window여야 합니다. 그러면 익명 함수가 반환하는 this.name은 다음과 같습니다. 실제로는 window.name이므로 주의하세요. 나오는 것은 "큰 그림"입니다!
그럼 클로저에서 이걸 어떻게 투빈으로 만들 수 있을까요?
코드 복사 코드는 다음과 같습니다.
var name="global";
var twobin={
name:"local",
getName:function(){
var that=this;
return 함수(){
=이때 getName 함수의 런타임 위치는
alert(twobin.getName()); 🎜> 그러면 이것은 twobin을 가리킵니다. 객체이므로 이는 또한 twobin 객체를 가리킵니다. 클로저의 익명함수에서 that.name이 반환된다면 이때 반환된 that.name은 실제로 twobin.name이므로 "local"에 경고할 수 있습니다!
이것은 호출 및 적용
자바스크립트에서 이를 제어할 수 있는 유일한 것은 호출 및 적용입니다.
부름과 신청은 이 부모님과 같습니다. 이것을 살려주는 곳에서 살 것이며 순종해야 합니다!
코드 복사
코드는 다음과 같습니다.
}
getName(twobin);
getName .call(twobin);
이것은 getName 함수에 있습니다. 이것이 어디에 있든 간에, 기능이 실행될 때 위치를 찾아야 합니다. 이때 getName 함수가 실행될 때의 위치는
getName(twobin);
분명히 getName 함수가 위치한 객체는 window이므로 이것의 home은 window에 있어야 하며, 즉, 창 개체를 가리키면 getName이 이를 반환합니다. 이름은 실제로 window.name이므로 경고는 "전역"으로 표시됩니다.
그럼 그들의 명령을 들어야 하기 때문에 전화해서 신청할 시간입니다!
getName.call(twobin);
그 중 call은 이것의 홈이 twobin 객체임을 지정합니다. 왜냐하면 이것은 강제로 twobin에만 정착되어야 하기 때문입니다. 그러면 this는 이때 twobin 객체를 가리키고, this.name 실제로는 twobin.name이므로 경고가 "부분"으로 나옵니다!
약간 요약
방탕한 this: 항상 함수가 생성된 개체가 아니라 함수가 실행 중인 개체를 가리킵니다. 익명 함수에 있거나 어떤 개체에도 없으면 this는 다음을 가리킵니다. 창 객체; 호출 또는 적용인 경우, 어떤 객체를 지정하면 해당 객체를 가리킵니다!