this와 실행 상하문 구현 코드

5007 단어
함수의 실행 컨텍스트는 현재 실행 환경에 따라 다릅니다.
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
func1에는 전역 대상과 같은 이름의 v1 변수가 있기 때문에func1에서 v1을 직접 인용하는 것은func1에서 정의한 변수입니다.javascript 역시 국부 변수가 전역 변수를 숨기는 특성을 가지고 있습니다.그러나func1은 부속 대상을 명확하게 지정하지 않았기 때문에 그의 실행 상하문은 전역 대상이고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()가 실행될 때 상하문에 정의가 없기 때문에thisv 변수, 접근 오류가 발생했습니다.
참고 위 코드:


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의 역할역은 정의할 때 전역으로 확정됩니다.그래서 method2가Class1 내부에서 호출되었을 때 그 역할 영역은 전역이고 상하문은 전역 대상이다.따라서 함수에 접근하는 변수는 모두 전역 변수이다.
도리에 맞다method2가 호출될 때 그 역할역은 전역이지만 이 함수는 정의할 때this 키워드를 사용하여 상하문이 Class1인 대상을 가리키기 때문에 이 함수가 상하문에 한정된 변수가 없을 때 전역 변수에 접근하고 상하문에 한정된 변수가 있을 때 현재 상하문에 대응하는 변수에 접근합니다.
method3과this를 호출합니다.method3에서 상하문에 한정된 변수가 없을 때 국부 변수에 접근합니다. 국부 변수가 전역 변수를 숨기기 때문입니다.상하문 제한이 있는 시간은method2와 같습니다. 현재 상하문에 접근한 변수입니다.
콜과 apply를 사용하면 실행 상하문을 바꿀 수 있습니다. 콜과 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가 가리키는 상하문은 전역 대상이다.

좋은 웹페이지 즐겨찾기