this 와 실행 컨 텍스트
7191 단어 JavaScript
Javascript 에서 this 키 워드 는 현재 함수 의 소유 자 를 가리 키 고 있 습 니 다.javascript 에 서 는 이 소유 자 를 실행 컨 텍스트 라 고 합 니 다.함수 의 실행 컨 텍스트 는 현재 실행 환경 에서 정 해 집 니 다.
1. 전역 변수 와 전역 함수 가 전역 대상 (window) 에 붙 어 있 기 때문에 'var' 또는 'this' 두 가지 방법 으로 전역 변 수 를 같은 효 과 를 정의 합 니 다.
2. 상하 문과 작용 역 이 다르다.상하 문 이 실 행 될 때 확인 되 며, 언제든지 변 할 수 있 으 며, 역할 영역 은 정 의 될 때 확인 되 며, 영원히 변 하지 않 습 니 다.
3. 현재 실행 되 고 있 는 것 이 대상 의 방법 이 라면 상하 문 을 실행 하 는 것 이 이 방법 에 부 속 된 대상 이다.
4. 현재 대상 을 만 드 는 과정 이 라면 컨 텍스트 를 실행 하 는 것 이 만 들 고 있 는 대상 입 니 다.
5. 만약 한 방법 이 실 행 될 때 부속 대상 을 명확 하 게 지정 하지 않 았 다 면, 이 방법의 상하 문 은 전역 대상 이다.
6. 콜 과 apply 를 사용 하면 대상 의 실행 상하 문 을 바 꿀 수 있 습 니 다.
아래 의 예 를 보십시오.
var v1 = "global variable"; //
//this.v1 = "global variable with this"; // var v1 this.v1 。
function func1(){
var v1 = "part variable";
writeHtml(v1);
writeHtml(this.v1);
}
func1(); //part variable
//global variable
func 1 에는 전체 대상 과 같은 이름 의 v1 변수 가 있 기 때문에 func 1 에서 v1 을 직접 참조 하 는 것 은 func 1 에서 정의 하 는 변 수 를 참조 합 니 다.javascript 역시 국부 변수 가 전역 변 수 를 숨 기 는 특성 이 있 습 니 다.그러나 func 1 은 부속 대상 을 명확 하 게 지정 하지 않 았 기 때문에 그의 실행 컨 텍스트 는 전체 대상 이 고 this 참조 변 수 를 사용 하 는 것 은 전체 변수 입 니 다.
조금 복잡 한 예 를 다시 보 자.
function ftest(){
var v = "v1v1v1";
this.this_v = "this_v";
return function(){
writeHtml(v);
writeHtml(this.this_v);
}
}
var a = ftest();
var v = "v2v2v2";
writeHtml(this_v); // this_v
a(); //v1v1v1
//this_v
ftest 를 함수 로 실행 할 때 상하 문 은 전역 대상 입 니 다.그래서 ftest 에서 this 정 의 를 사용 하 는 변 수 는 전역 변수 가 되 었 습 니 다.그래서 우 리 는 ftest 밖에서 변수 이름 으로 this 를 직접 방문 합 니 다.v 의 값.그러나 ftest 에서 되 돌아 오 는 익명 함 수 는 ftest 내부 에 정의 되 어 있 기 때문에 이 익명 함수 의 역할 영역 은 ftest 내부 에 있 습 니 다.따라서 전역 변수 v 와 국부 변수 v 가 같은 이름 일 때 이 익명 함 수 는 ftest 내부 에서 정 의 된 변수 v 에 접근 합 니 다.
다음은 ftest 를 클래스 로 하고 new 키 워드 를 사용 하여 실례 화 합 니 다.
function ftest(){
var v = "v1v1v1";
this.this_v = "this_v";
return function(){
writeHtml(v);
writeHtml(this.this_v);
}
}
var a = new ftest();
var v = "v2v2v2";
//writeHtml(this_v); // :this_v
a(); //v1v1v1
//undefined
ftest 를 대상 으로 예화 할 때 대상 의 생 성 과정 에서 상하 문 은 생 성 된 대상 자체 입 니 다.이 때 만 든 대상 은 ftest 의 인 스 턴 스 이 고 만 든 후에 함수 가 되 돌 아 왔 습 니 다. 이 로 인해 new ftest () 를 예화 한 후에 ftest () 가 아 닌 함수 로 되 돌 아 왔 습 니 다.따라서 이 실례 화 된 대상 은 인용 할 수 없다.우리 가 이 되 돌아 오 는 함 수 를 정의 할 때, this 로 이 함수 의 상하 문 을 지정 하지 않 았 기 때문에, 이 되 돌아 오 는 함수 상하 문 은 전역 대상 이 고, 작용 역 은 ftest () 함수 내부 입 니 다.그래서 함수 a () 가 실 행 될 때 문맥 에 this 가 정의 되 지 않 았 기 때 문 입 니 다.v 변수, 접근 오류 가 발생 했 습 니 다.
주의, 위의 코드:
function ftest(){
return function(){
}
}
이러한 형식 은 정적 패 키 징 환경 이 아 닙 니 다. 정적 패 키 징 환경 은 하나의 함수 정의 가 완 료 된 후에 바로 실행 하고 완 료 된 후에 함수 중의 한 내부 함 수 를 되 돌려 야 합 니 다.
우 리 는 다음 예 를 보고 역할 영역 과 문맥 이 변수 인용 에 미 치 는 영향 을 관찰 합 니 다.
var v = "global variable";
function method(){
writeHtml(v);
writeHtml(this.v);
}
var Class1 = function(){
var v = "private variable";
this.v = "object variable";
var method2 = method;
this.method2 = method;
var method3 = function(){
writeHtml(v);
writeHtml(this.v);
}
this.method3 = function(){
writeHtml(v);
writeHtml(this.v);
}
method2(); //global variable
//global variable
this.method2(); //global variable
//object variable
method3(); //private variable
//global variable
this.method3();//private variable
//object variable
}
var obj = new Class1();
method 는 전역 에서 정의 되 기 때문에 method 의 역할 영역 은 정의 할 때 전역 으로 확 정 됩 니 다.그래서 method 2 가 Class 1 내부 에서 호출 되 었 을 때 그 역할 영역 은 전역 이 고 상하 문 은 전역 대상 이다.따라서 함수 에서 접근 하 는 변 수 는 모두 전역 변수 입 니 다.
같은 이치 로 this. method 2 가 호출 될 때 그 역할 영역 은 전역 이지 만 이 함수 가 정의 할 때 this 키 워드 를 사용 하여 상하 문 이 Class 1 인 대상 을 가리 키 기 때문에 이 함수 가 상하 문 에 한 정 된 변수 가 없 을 때 전역 변 수 를 방문 하고 상하 문 에 한 정 된 변 수 를 방문 할 때 현재 상하 문 에 대응 하 는 변 수 를 방문 합 니 다.
method 3 와 this. method 3 를 호출 할 때 상하 문 에 한 정 된 변수 가 없 을 때 국부 변수 에 접근 합 니 다. 국부 변수 가 전역 변 수 를 숨 겼 기 때 문 입 니 다.문맥 제한 시간 은 method 2 와 같 습 니 다. 현재 상하 문의 변 수 를 방문 합 니 다.
call 과 apply 를 사용 하면 실행 컨 텍스트 를 바 꿀 수 있 습 니 다. call 과 apply 는 매개 변수 형식 만 다 르 기 때문에 예 를 들 어 모두 call 로 보 여 줍 니 다.
var v = "global variable";
var method = function(){
writeHtml(this.v);
}
var Class2 = function(){
this.v = "object variable in instance of Class2";
this.method = function(){
writeHtml(this.v);
}
}
var Class3 = function(){
this.v = "object variable in instance of Class3";
this.method = function(){
writeHtml(this.v);
}
}
var obj2 = new Class2();
var obj3 = new Class3();
method(); //global variable
obj2.method(); //object variable in instance of Class2
obj3.method(); //object variable in instance of Class3
method.call(obj2); //object variable in instance of Class2
method.call(obj3); //object variable in instance of Class3
obj2.method.call(obj3); //object variable in instance of Class3
obj2.method.call(this); //global variable
obj3.method.call(obj2); //object variable in instance of Class2
obj3.method.call(this); //global variable
콜 이나 apply 를 사용 하면 지정 한 컨 텍스트 에 방법 을 연결 할 수 있 습 니 다.전역 환경 에서 this 가 가리 키 는 상하 문 은 전역 대상 입 니 다.
참고 주소:
http://www.cnblogs.com/birdshome/archive/2005/03/07/95931.html
http://www.cnblogs.com/birdwudi/archive/2007/08/02/840537.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.