<당신이 모르는 자바스크립트 (위) > 작용역과 패키지 닫기 (1)

2854 단어
이라는 책의 중상권 목록을 뒤적인 후에 책에서 클로즈업, 대상, 원형, 문법, 비동기, 리셋 등 기초적이고 중요한 자바스크립트 지식에 대해 목적성 있게 논술한 것을 발견하고 이 책의 중상권을 배우기로 결정했다.상권과 중권은 각각 두 가지 대부분 지식을 설명했는데 그것이 바로 작용역과 클로즈업,this와 대상의 원형, 유형과 문법, 비동기와 성능이다.본고는 작용역과 폐쇄에 대한 학습 총결이다.
첫 번째 부분에서 6장으로 나뉘어 서술했지만 주로 세 가지 큰 지식으로 나뉜다. 그것이 바로 컴파일 원리, 작용역과 폐쇄 메커니즘이다. 자바스크립트 엔진의 컴파일 원리 규칙에 의존해야 작용역의 이념을 형성할 수 있고 작용역의 이념에 의존해야 폐쇄 메커니즘의 역할을 나타낼 수 있다고 생각한다.
컴파일링 원리에 대한 파악은 자바스크립트 컴파일링의 절차, 엔진, 컴파일러, 작용역 간의 상호 관계, 그리고 조회 메커니즘을 알아야 한다.
1.javascript를 컴파일하는 절차는 일반적으로 프로그래밍 언어를 컴파일하는 절차는 단어/문법 분석, 해석/문법 분석, 코드 생성 등 세 단계이다.
  • 분사/문법분석: 문자열을 코드 블록(또는 문법 단원)으로 분해하면 분사이고 특정한 규칙에 따라 분사하는 것이 문법분석이다.
  • 해석/문법 분석: 어법 단원 흐름을 원소의 단계별 삽입으로 구성된 프로그램 문법 구조를 대표하는 트리(추상 문법 트리,AST)로 전환한다.javascript의 작용역은 기본적으로 이 단계에서 형성되고 어법 작용역이라고도 부른다.
  • 코드 생성:AST를 엔진이 실행할 수 있는 코드로 바꾸는 과정.

  • 그러나 js 엔진에 대해 말하자면 컴파일 과정은 좀 복잡하다. js 엔진의 대부분 컴파일 작업은 코드가 실행되기 전의 짧은 시간(매우 매우 짧음)에서 발생하기 때문에 컴파일할 때js 엔진은 코드의 운행 성능 최적화를 해야 한다(이곳은 중점이다. 성능 최적화는 이 단계에서 발생하기 때문에 코드를 작성할 때 코드가 이 단계의 작업에 관여하지 않도록 주의해야 한다. 이 부분의 뒷부분에서 언급될 것이다).
    2. 엔진, 컴파일러, 역할 영역 간의 관계는 먼저 명확한 점을 필요로 한다. 컴파일러도 엔진의 일부이기 때문에 이를 분리하여 단독으로 주체로 하는 것은 이 세 가지 측면의 관계를 더욱 잘 논술하기 위해서이다.간단하게 말하면 컴파일러가 어법을 분석함으로써 작용역의 변수, 표지부 등 이런 것들을 생성한다.엔진은 코드를 실행하는 과정에서 역할 영역에서 필요한 표지부를 찾는다.작용역은 코드 실행 및 표지부 저장 범위로 이해할 수 있다.세 가지 역할을 구체적으로 분석하려면 다음과 같이 간단히 설명합니다.
    var a=2;
    

    이 성명을 실행하는 과정에서 컴파일러는 두 가지 역할을 한다. a. 역할 영역에서 a를 조회하고 a가 존재하지 않으면 역할 영역에서 a라는 변수를 성명한다.b. 엔진에 값을 부여하는 동작을 수행하는 코드를 생성합니다.엔진도 두 가지 역할을 한다. a. 역할 영역에서 a를 조회한다.b. a에 값을 부여합니다.
    3. 조회 메커니즘은 상기 부분에서 조회를 언급했기 때문에 엔진의 조회 메커니즘을 이해해야 한다.조회 메커니즘은 두 가지로 나뉘는데 그것이 바로 LHS 조회와 RHS 조회이다.책에서 두 가지 조회 메커니즘의 원래 뜻을 비교적 전면적으로 논술한 결과 두 가지 조회 메커니즘의 관건은 다음과 같다.
  • LHS 조회: 변수를 찾아서 변수에 값을 부여하기 위해'값 부여 작업의 목표가 누구인지'로 이해할 수 있다.
  • RHS 조회: 변수를 찾아 변수가 있는지 확인하고'누가 부치 조작의 원천인지'로 이해할 수 있다.마찬가지로 다음과 같은 코드를 예로 들어 구체적으로 분석한다.
      function foo(a) {
        console.log(a);
      }
      foo(2);
    
  • 1. 먼저 엔진은 foo라는 표지부에 대해 RHS 조회를 하고 존재하는지 확인한 결과 컴파일러가 이미 설명한foo가 하나의 함수를 대표하는 것을 발견한다.2. 이어서 엔진은 함수 실행 단계에서 a에 대해 LHS 조회를 실행하고 2라는 값을 부여한다.3. 이어서 엔진은 콘솔에 대해 RHS 조회를 실시하여 존재하는지 확인하고 콘솔과 그 하위 함수log()가 모두 내장된 방법임을 발견한다.4. 마지막으로 엔진은log(a)에서 a를 보았다. 그래서 a에 대해 RHS 조회를 한 번 했는데 a가 존재하는 것을 발견했다. 그리고 두 번째 단계의 LHS 조회에서 이미 2가 부여되었다. 그래서 이 2를log(a)의 a에 전달했다.
    두 질의 모두 예외가 있으며 그 예외도 다릅니다.
  • RHS 조회에 있어 그 어떠한 관련 작용역(이곳에서 작용역 체인의 원리를 이해해야 함)에서 변수를 찾지 못하면 엔진은 Reference Error 이상을 던진다.
  • LHS 조회에서 변수를 찾지 못하면 두 가지 상황이 존재한다. 엄격하지 않은 모드에서 변수를 찾지 못하면 전역 작용역에서 이 변수를 만들고 반환 엔진을 만든다. (이곳에서 주의해야 할 것은 일반적으로 js의 작용역은 모두 어법 작용역이고 정적이지만 이런 상황에서 작용역이 바뀌어 문법에 속았다).엄격한 모드(ES5는 엄격한 모드를 도입)에서 엔진도 Reference Error 이상을 던지고 역할 영역에서 변수를 만드는 동작이 나타나지 않는다.또한 검색 결과에 대한 불법 또는 불합리한 조작(LHS 조회 이후에 존재)은 엔진이TypeError 이상을 던진다.

  • 이상은 원리 방면의 지식을 번역한 것이다.
    Small Star's Blog | 샛별의 블로그

    좋은 웹페이지 즐겨찾기