JavaScript 의 역할 영역 과 역할 영역 체인 을 간략하게 분석 합 니 다.

5605 단어
A. 모든 프로 그래 밍 언어 는 역할 영역 이라는 개념 을 가진다.역할 영역 (scope) 은 변수 (variable) 와 함수 (function) 의 접근 가능 한 범위 입 니 다. 다시 말 하면 scope 는 variable 와 function 의 가시 성과 생명 주 기 를 제어 하고 있 습 니 다.
  • 전역 작용 역 의 모든 브 라 우 저 (원생 js 를 사용 하면 브 라 우 저의 호 환 문 제 를 해결 해 야 함) 는 윈도 우 대상 을 지원 하 며 브 라 우 저 창 을 표시 합 니 다.따라서 javacript 의 전역 대상 함수 변 수 는 자동 으로 window 대상 의 구성원 이 되 고 함수 가 window 대상 이 되 는 방법, 변 수 는 window 대상 의 속성 이 됩 니 다.코드 가 어디 에 나 접근 할 수 있 는 대상 은 전역 작용 역 을 가지 고 있 으 며, 보통 다음 세 가지 상황 은 전역 작용 역 을 가지 고 있다.
  • (1) 최 외층 함수 와 최 외층 함수 밖에서 정 의 된 변수 전역 작용 역, 예 를 들 어:
    var a = 1;     //    
    function f1() {
        alert(a);     //alerts '1'
        function inner() {
         alert(a);    //alerts '1'
        }
    }
    f1();    //  1 1;
    inner();      //    
    

    (2) JS 의 어느 위치 에서 도 var 키워드 성명 을 사용 하지 않 는 변수 도 전역 역할 영역 을 가지 고 있 습 니 다.
    function f1() {
         var firstName = "James";
          lastName = "Camelo";
          alert(firstName);       //alerts 'James'
          alert(secondName);      //alerts 'Camelo'
    }
    f1();    //  'James' 'Camelo'
    alert(firstName);    //    
    alert(secondName);    //  'Camelo'
    

    변수 secondName 은 전역 역할 영역 을 가지 고 있 으 며, firstName 은 함수 외부 에 접근 할 수 없습니다.
    (3) 모든 window 대상 의 속성 은 전역 역할 영역 을 가지 고 있 습 니 다.
    요약: 전역 변 수 는 전체 함수 의 생명주기 에 존재 하지만 전역 범위 내 에서 변경 되 기 쉽다.성명 변수 가 var 를 가지 고 있 지 않 으 면 혼란 을 초래 하기 쉽다.전역 변 수 를 적 게 사용 하고 var 를 가 져 옵 니 다.전역 변 수 는 프로그램의 전체 수명 주기 에 존재 하지만 이 를 통 해 전역 변 수 를 방문 할 수 있 는 것 은 아 닙 니 다.
    2. 국부 작용 역 / 함수 작용 역 은 전역 작용 역 과 반대로 함수 작용 역 은 일반적으로 함수 의 코드 부분 에서 만 접근 할 수 있 고 외부 에 서 는 변수 접근 을 할 수 없습니다.함수 내부 에서 정 의 된 변 수 는 함수 역할 영역 에 존재 하 며, 그 생명 주 기 는 함수 의 실행 이 끝나 면서 끝 납 니 다.예 를 들 면:
    var name = 'James';
    function getName(){
        var name = 'Camelo';
        alert(name);  //alerts 'Camelo'
    }
    alert(name);  //alerts ‘James'
    

    3. 품사 역할 영역 / 정적 역할 영역 품사 역할 영역: 함 수 는 역할 영역 에서 실행 되 는 것 이지 역할 영역 에서 실행 되 는 것 이 아 닙 니 다.다시 말 하면 어법 작용 역 은 코드 를 쓸 때 함수 성명 의 위치 에 의 해 결정 된다 (eval () 와 with 는 어법 작용 역 을 속 일 수 있다).아니면 하나의 예 를 통 해 어법 작용 역 을 이해 합 니까?
    var name = "James";
    function f1(){
        alert(name);  //alerts 'undefined'
        var name = 'Camelo';
        alert(name);  //alerts 'Camelo'
    }
    f1();  //   'undefined' 'Camelo'
    

    js 해석 기 는 모든 코드 를 실행 하기 전에 전역 대상 을 만 듭 니 다. 전역 변 수 는 이 전역 대상 의 속성 에 해당 합 니 다.f1 이라는 함수 에 대해 호출 대상 이라는 것 이 생 성 됩 니 다. 국부 변수 함수 파라미터 와 Arguments 는 모두 이 대상 의 일부분 입 니 다.더 치 명 적 인 것 은 호출 대상 이 역할 도 메 인 체인 의 전단 에 있 습 니 다. 이 는 전체 대상 의 속성 에서 호출 대상 과 같은 이름 의 속성 이 숨겨 진 다 는 것 을 의미 합 니 다 (변수의 조 회 는 가장 가 까 운 바 인 딩 컨 텍스트 부터 외부 로 점점 확장 되 고 첫 번 째 바 인 딩 이 완 료 될 때 까지 검색 을 끝 냅 니 다).그래서 코드 세 션 의 f1 함수 내부 'var name =' Camelo ',' var name = 'James',' 숨겨 지고 첫 번 째 alert (name) 는 'var name =' Camelo ',' 이전에 'undefined' 를 출력 했 습 니 다. 함수 정의 가 끝나 면 name 이 역할 영역 에 추가 되 었 기 때문에 alert ()name 이라는 속성 을 찾 을 수 있 지만 징 그 러 운 일 name 은 할당 되 지 않 았 습 니 다. 코뿔소 책 에는 자바 script 함수 가 "그들의 역할 영역 에서 실행 되 는 것 이 아니 라 그들의 역할 영역 에서 실행 되 는 것" 이 라 고 쓰 여 있 습 니 다. 얼마나 추상 적 이 고 정수 적 인 지 를 설명 한 후에 상기 코드 는 다음 코드 와 같 습 니 다.
    var name = "James";
    function f1(){
        var name;
        alert(name);  //alerts 'undefined'
        name = 'Camelo';
        alert(name);  //alerts 'Camelo'
    }
    f1();  //   'undefined' 'Camelo'
    

    javascript 의 함 수 는 호출 을 먼저 쓰 고 정 의 를 쓸 수 있 지만, 이렇게 하 는 것 은 매우 좋 지 않 으 며, 좋 지 않 은 습관 을 기 르 고 유지 하기 어 려 울 것 입 니 다.
    var name = "James";
    f1();  //   'undefined' 'Camelo'
    function f1(){
        var name;
        alert(name);  //alerts 'undefined'
        name = 'Camelo';
        alert(name);  //alerts 'Camelo'
    }
    

    4. 동적 역할 영역 과 품사 역할 영역 은 정의 할 때 확인 하 는 것 과 다 릅 니 다. 동적 역할 영역 은 실행 할 때 확인 되 며, 생존 주 기 는 코드 세 션 이 실 행 될 때 까지 입 니 다. 동적 변 수 는 동적 역할 영역 에 존재 하 며, 주어진 바 인 딩 값 은 함수 호출 을 확정 하기 전에는 알 수 없습니다.
    코드 가 실 행 될 때 대응 하 는 역할 영역 은 정적 이지 만 우 리 는 일부 방법 이나 문 구 를 통 해 역할 영역 체인 을 바 꿀 수 있 습 니 다. 예 를 들 어 with 문 구 를 실행 한 후에 역할 영역 체인 을 원래 상태 로 회복 하지만 일반적으로 with 문 구 를 사용 하지 않 습 니 다. 성능 이 너무 지연 되 기 때 문 입 니 다):
    var name = 'James'
    alert(name);  //alerts 'James'
    with({name; 'Camelo'}){
        alert(name);  //alerts'Camelo'
    }
    alert(name);  //alerts'James'
    

    물론 콜 방법, apply 방법 과 try - catch 의 catch 도 역할 도 메 인 체인 을 수정 할 수 있 습 니 다. 그러나 중요 한 것 은 역할 도 메 인 체인 에 동적 역할 도 메 인 이 존재 할 때 this 인용 은 더욱 복잡 해 지고 처음 만 든 문맥 을 가리 키 지 않 고 호출 자 에 의 해 결정 된다 는 것 입 니 다.
    5. 블록 급 역할 영역 (ES6 에 추 가 된 let 는 블록 급 역할 영역 을 만 들 수 있 습 니 다) 이 C 의 프로 그래 밍 언어 와 다 르 고 JavaScript 에 블록 급 역할 영역 이 없습니다. 다시 말 하면 블록 급 구문 내부 에서 설명 하 는 변 수 는 외부 에서 설명 하 는 변수 와 같 으 며 이 블록 급 구문 외부 에서 도 이러한 변수의 값 을 방문 하고 수정 할 수 있 습 니 다. 예 를 들 어:
    function f1(){
        if( 1 < 3 ){
            var name = 'James';
        }
        alert(name);  //alerts'James'
        name = 'Camelo';
        alert(name);  //alerts'Camelo'
    }
    f1();    //  'James' 'Camelo'
    

    B. 역할 도 메 인 체인 * 8195: 두 가지 모델: * 8195: 품사 역할 도 메 인 은 함수 와 역할 도 메 인 이 어디서 정의 되 는 지 에 만 관심 을 가지 고 어디서 실행 되 는 지 에 관심 을 두 지 않 습 니 다. 역할 도 메 인 체인 은 보통 포 함 된 역할 도 메 인 체인 입 니 다. 역할 도 메 인 을 하나의 끈 으로 생각 할 수 있 습 니 다. 현재 역할 도 메 인 은 끈 끝 에 있 고 전체적인 역할 도 메 인 은 끈 끝 에 있 습 니 다. RHS 와 LHS 인용 은 끈 끝 에서 부터 찾 아 끈 끝 에 있 을 때 까지 찾 습 니 다.도착 하지 않 으 면 이상 (엄격 한 모드 에서) 으로 돌아 갑 니 다.
    function foo() {
        alert(a);    // 3
    }
    function bar() {
        var a = 3;
        foo();
    }
    var a = 2;
    bar();
    

    좋은 웹페이지 즐겨찾기