JS 독서 노트 (4) 변수 역할 영역

정의 되 지 않 은 변수
설명 되 지 않 은 변수
할당 되 지 않 은 변수
 
정의 되 지 않 은 변수 = 설명 되 지 않 은 변수
 
  • 성명 되 지 않 은 변 수 를 읽 으 려 고 시도 하면 실행 중 오류 가 발생 할 수 있 습 니 다.
  • 설명 되 지 않 은 변수 에 값 을 부여 하려 고 시도 하면 오류 가 발생 하지 않 습 니 다. 반대로 프로그램 은 전체 역할 영역 에서 암시 적 으로 소 리 를 냅 니 다.
  • 할당 되 지 않 은 변 수 를 읽 으 려 고 시도 하면 기본 값 인 undefined 를 얻 을 수 있 습 니 다.

  • 변수 역할 영역의 기본 규칙:
  • 도 메 인 에서 var 로 설명 하 는 변 수 는 현재 도 메 인 이나 현재 도 메 인의 하위 도 메 인 에서 만 작 동 합 니 다.
  • 변 수 를 찾 는 것 은 항상 현재 도 메 인 에서 시작 하여 각급 포 함 된 부모 도 메 인 을 찾 고 마지막 으로 전체 국면 에 도착 합 니 다.따라서 현재 필드 의 부분 변 수 를 부모 필드 의 부분 변수 나 전체 변수 와 같은 이름 으로 지정 하면 상위 변수 나 전체 변 수 를 효과적으로 숨 길 수 있 습 니 다.
  • 자바 script 은 함 수 를 제외 한 모든 프로그램 단락 이 독립 된 도 메 인 이 아 닙 니 다.다시 말 하면 자 바스 크 립 트 는 블록 급 작용 역 이 없다
    for(var i = 10;i < 10;i++)
      {
         do something
      }
    
    alert(i);// i = 9
     

  • javascript 변수 역할 영역 은 실행 할 때 결정 하 는 것 이 아니 라 정의 할 때 결정 하 는 것 입 니 다. 즉, 품사 역할 영역 은 소스 코드 에 달 려 있 고 컴 파일 러 는 정태 적 인 분석 을 통 해 확정 할 수 있 기 때문에 품사 역할 영역 도 정태 적 인 역할 영역 이 라 고 합 니 다.
     
    javascript 은 모든 함수 인 스 턴 스 를 실행 할 때 실행 환경 을 만 듭 니 다. 실행 환경 에는 호출 대상 이 포함 되 어 있 습 니 다. 호출 대상 은 scriptObject 입 니 다. 내부 변수 표, 내장 함수 표, 부모 인용 표 등 문법 분석 구 조 를 저장 하 는 데 사 용 됩 니 다.(내부 변수 표 와 내장 함수 표 등 정 보 는 문법 분석 단계 에서 이미 얻 었 고 문법 트 리 에 저 장 됩 니 다. 함수 인 스 턴 스 가 실 행 될 때 이 정 보 를 문법 트 리 에서 scriptObject 로 복사 합 니 다).
     
    var arg = 1;
    function funcTest() {
        alert(arg);
        var arg = 2;
    }
    arg = 10;
    funcTest();

     
     이 함수 의 출력 은 undefined 이지 10 이 아 닙 니 다. functest 함수 가 실 행 될 때 functest 에 대응 하 는 역할 영역 에 들 어가 서 alert 를 실행 할 때 변수 이름 arg 를 만 났 을 때 현재 역할 영역 에서 찾 습 니 다. arg = 2 는 alert 방법 으로 정의 되 어 있 기 때문에 컴 파일 을 시작 할 때,(품사 분석 은 이미 정 의 된 변수 와 방법 을 얻 었 다. 이것 은 바로 변수 역할 도 메 인 은 정의 할 때 결정 하 는 것 이지 실행 할 때 결정 하 는 것 이 아니다. 즉, 품사 역할 도 메 인 은 소스 코드 에 달 려 있 고 컴 파일 러 는 정태 적 인 분석 을 통 해 확정 할 수 있다) 이 현재 역할 도 메 인 에 변 량 arg 가 존재 하지만 할당 되 지 않 았 기 때문에 arg 의 값 은 undefined 이다.
     
    역할 영역 에 관 한 좋 은 글 입 니 다.
     
    다른 글 에서 역할 영역 에 대한 설명:
     
    JavaScript 의 함 수 는 동적 역할 영역 이 아 닌 정적 역할 영역 을 기반 으로 합 니 다. 이 말 은 JavaScript 의 함 수 는 실 행 된 역할 영역 이 아 닌 정 의 된 역할 영역 에서 실 행 됩 니 다. 정적 작업 영역 에서 변 수 는 항상 최상 위 역할 영역 을 가리 키 고 있 습 니 다. 프로그램 텍스트 (program text) 입 니 다.하나의 속성 을 실행 할 때 호출 되 는 스 택 과 는 무관 합 니 다. 변 수 를 일치 시 키 는 역할 도 메 인 은 프로그램 텍스트 만 분석 하면 되 기 때 문 입 니 다. 이러한 역할 도 메 인 은 정적 역할 도 메 인 (lexical scoping) 이 라 고 합 니 다.
    function f1() {
       var a = 20;
       return function () { alert(a); }
    }
    
    var b = f1();
    b();

    결과: 20
     
    function f1() {
        var a = 20;
        return f2
    }
    
    function f2() {
       alert(a);
    }
    
    var b = f1();
    b();

     결과: undefined (사실은 잘못 보 고 했 습 니 다. 정의 되 지 않 은 변 수 를 인 용 했 기 때 문 입 니 다)
     
    프로그램 1 에서 익명 함수 b () 가 설명 되 었 을 때 변수 a 는 역할 영역 에 저장 되 어 있 습 니 다. 따라서 20 을 얻 었 습 니 다. 그러나 프로그램 2 에 서 는 함수 f2 () 에 서 는 변수 a 를 설명 하지 않 아 값 이 없습니다.
    그러나 함수 가 정의 되 었 습 니 다. 그 역할 영역 과 역할 영역 체인 을 '기억' 합 니 다. 이것 은 함수 의 모든 변 수 를 의미 하 는 것 이 아 닙 니 다. 반대로 임의로 추가, 수정, 삭제 할 수 있 습 니 다. 함수 에는 최신 변 수 를 저장 합 니 다. 그러나 이 역할 영역 에 언제 포함 되 는 것 이 아니 라 변수 가 정의 되 는 지 알 아야 합 니 다.
     
    정적 역할 영역의 몇 가지 특징
  • 프로그램 에서 특수 한 곳 에서 정 의 된 변 수 는 똑 같은 정 의 를 가 진 변 수 를 영원히 가리 키 고 있 습 니 다. 즉, 프로그램 이 실 행 될 때마다 실 행 된 함수 가 있 는 역할 영역 에서 똑 같은 정 의 를 가 진 변 수 를 가리 키 고 있 습 니 다.
  • 변 수 는 정적 검사 (static examination) 소스 코드 에 나타 난 식별 자 (var) 를 통 해 전체 함 수 를 하나의 전체 로 실행 하 는 것 이 아니 라 값 (value) 을 변경 할 수 있 습 니 다.
  •  

    좋은 웹페이지 즐겨찾기