this 와 실행 컨 텍스트

7191 단어 JavaScript
this 와 실행 컨 텍스트
       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

좋은 웹페이지 즐겨찾기