당신 이 모 르 는 자바 script 노트 (1) - 역할 영역 과 패키지

6744 단어
1. 역할 영역 폐쇄
1.1 역할 영역 은 무엇 입 니까
1.1.1 컴 파일 원리 과정
js 의 코드 컴 파일 은 실행 전에 발생 합 니 다. 과정 은 다음 과 같 습 니 다.
  • 품사 분석 은 코드 문자열 을 의미 있 는 코드 블록 으로 분해 합 니 다
  • 문법 분석 은 이전 단계 의 코드 블록 을 요소 의 단계별 구성 으로 구 성 된 AST 로 변환 합 니 다.
  • 코드 가 AST 를 실행 가능 한 코드 (기계 명령) 로 변환 하 는 과정 을 생 성 한다.

  • 1.1.2 RHS 와 LHS
    RHS 는 어떤 변수의 값 을 찾 는 것 을 표시 합 니 다.LHS 는 변수 용기 자 체 를 찾 아 값 을 부여 하 는 것 을 말한다.
    RHS 와 LHS 가 찾 을 때 현재 역할 영역 에서 목 표를 찾 지 못 하면 계속 위로 찾 아 순서대로 유추 합 니 다.
    RHS 가 마지막 에 변수의 값 을 찾 지 못 하면 js 엔진 은 Reference Error 이상 을 던 집 니 다.
    엄격 하지 않 은 모드 에서 LHS 가 용기 의 정 의 를 찾 지 못 하면 js 엔진 은 전역 역할 영역 에서 자동 으로 이 용 기 를 만 듭 니 다.
    그러나 엄격 하지 않 은 모드 에서 도 엔진 은 Reference Error 이상 을 던 질 수 있다.
    만약 당신 이 RHS 의 값 을 부적 절 하 게 조작 했다 면 엔진 은 TypeError 이상 을 던 질 것 입 니 다.
    1.2 어법 작용 영역
    품사 작용 도 메 인 은 품사 단계 에 정의 된다.
    역할 영역 찾기 는 첫 번 째 일치 하 는 부 호 를 찾 을 때 중단 합 니 다.여러 겹 으로 포 함 된 동명 식별 자 는 내부 의 표지 부 호 는 외 부 를 가 릴 수 있다.
    기만 어법 의 방식:
  • eval

  • 동적 생 성 코드
  • with

  • 빠 른 접근 대상 내부 속성
    품사 사기 결함: 컴 파일 단계 에서 진행 되 는 정적 최적화 가 잘못 되 고 성능 을 떨 어 뜨 릴 수 있 습 니 다.
    1.3 함수 역할 영역 과 블록 역할 영역
    이 함수 에 속 하 는 모든 변 수 는 전체 함수 범위 내 에서 사용 할 수 있 습 니 다.
    1.3.1 내부 숨 기기 실현
    이 변 수 는 새로 만 든 함수 의 역할 영역 에 연결 되 어 있 습 니 다.
    명명 충돌 회피
  • 전역 네 임 스페이스
  • 독특한 대상 을 최고급 문법 작용 역 에 명명 하고 대상 에 구체 적 인 정 보 를 봉인 합 니 다.
  • 모듈 화 관리
  • 모듈 화 관리 도구.
    1.3.2 함수 역할 영역
    함수 성명 과 표현 식: function 이 처음 나타 난 것 은 함수 성명 이 고, 그렇지 않 은 것 은 함수 표현 식 입 니 다.
    서명 과 익명
    익명 함수
    장점 은 바로 쓰기 가 빠 르 지만 단점 이 많다 는 것 이다.
  • 오류 스 택 에서 함수 이름 을 가 져 올 수 없고 디 버 깅 하기 어렵 습 니 다
  • 함수 명 이 없 는 경우 만 료 된 arguments. callee 를 통 해 자체 인용
  • 함수 이름 이 부족 하고 함수 에 대한 가 독성 이 떨어진다
  • 즉시 실행 함수
    함 수 를 () 감 싸 서 함수 표현 식 으로 만 들 고 이 어 뒤에서 직접 호출 합 니 다.
    UMD 모듈 관리 에 서 는 실행 할 코드 를 매개 변수 에 거꾸로 두 고 즉시 실행 함수 에서 실행 하 는 것 입 니 다.
    1.3.4 블록 역할 영역
  • with

  • with 에서 방문 한 대상 속성 은 현재 역할 에 만 존재 합 니 다.
  • try catch

  • catch 에서 블록 역할 영역 을 단독으로 형성 합 니 다.
  • let/const

  • 설명 한 변 수 를 블록 역할 영역 을 자동 으로 납치 합 니 다.변수 향상 문제 도 없 을 것 이다.
    let 를 통 해 for 순환 에서 적시에 변 수 를 얻 을 수 없 는 문 제 를 해결 할 수 있 으 며, let 납치 블록 역할 도 메 인 을 통 해 이미 사용 한 데이터 메모 리 를 방출 할 수 있 습 니 다.
    함수 역할 영역 과 블록 역할 영역 은 모두 같 습 니 다. 모든 성명 이 역할 영역 에 있 는 변 수 는 이 역할 영역 에 부 속 됩 니 다.
    1.4 승급
  • var

  • var 를 통 해 변 수 를 정의 할 때 컴 파일 단계 에서 설명 한 다음 에 실 행 될 때 코드 의 원래 위 치 를 복사 합 니 다.
    모든 역할 영역 에서 향상 작업 을 진행 합 니 다.
  • 함수
  • 함수 성명 은 향상 되 지만 함수 표현 식 은 그렇지 않 습 니 다.
    foo()
    var foo = function bar(){}
    

    여기 서 변 수 는 foo 가 올 라 간 다음 에 함수 bar 가 올 라 가지 않 기 때문에 오 류 는 Uncaught TypeError: foo is not a function 입 니 다.
  • 함수 우선
  • 함수 가 변수 향상 보다 우선 합 니 다.
    일반 블록 내부 의 함수 성명 은 일반적으로 역할 영역 상단 으로 올 라 갑 니 다.
    foo()
    if (true) {
        function foo () {
            console.log(1)
        }
    } else {
        function foo () {
            console.log(2)
        }
    }
    

    위의 코드 는 현재 최신 chrome 에서 실행 되 고 있 으 며, 마지막 오 류 는 여전히 Uncaught TypeError: foo is not a function 입 니 다.이 를 통 해 알 수 있 듯 이 js 엔진 은 if else 를 판단 한 후에 함수 성명 을 향상 시 키 지 않 았 다.
    1.5 역할 영역 폐쇄
    패 킷 을 닫 으 면 함수 가 정 의 된 품사 역할 영역 에 계속 접근 할 수 있 습 니 다.이 함 수 는 원 초적 인 정의 역할 영역 에 대한 인용 을 가지 고 있 으 며 어디서 실행 하 든 패 킷 을 사용 합 니 다.
    순환 문제
  • 즉시 실행 함 수 를 사용 하여 순환 할 때 실시 간 역할 영역 을 만 들 수 있 고 역할 영역 내부 에 그 당시 순환 중의 값 을 저장 할 수 있 습 니 다. 즉, 패 킷 방문 순환 중의 시간 값
  • 입 니 다.
    for (var i = 0; i < 10; i++) {
        (function(j) {
            //      
            setTimeout(() => {
                //          j
                console.log(j)
            })
        })(i)
    }
    
  • 매번 교체 할 때마다 하나의 역할 도 메 인 을 만 드 는 방법
  • for (let i = 0; i < 10; i++) {
        setTimeout(() => {
            console.log(j)
        })
    }
    

    모듈
    모듈 모드 의 두 가지 필요 조건:
  • 외부 폐쇄 함수 가 있어 야 하고 적어도 한 번 호출 되 어야 합 니 다
  • 폐쇄 함 수 는 적어도 하나의 내부 함 수 를 되 돌려 야 외부 가 내부 의 역할 영역 에 접근 할 수 있 고 폐쇄 가 형성 된다.

  • 현대 모듈 모드
    바로 바깥쪽 에 좋 은 포장 도 구 를 더 하면 내부 에 아무런 변화 가 없 을 것 이다.
    const myModule = (function Manager() {
        const modules = {}
        function define (name, dep_names, impl) {
            //      
            const deps = dep_names.map((dep_name) => {
                return modules[dep_name]
            })
            //        
            modules[name] = impl.apply(impl, deps)
        }
        function get (name) {
            return modules[name]
        }
        return {
          define,
          get
        }
    })()
    

    ES6 모듈
    ES6 에 서 는 '줄 내' 모듈 을 정의 할 수 없 으 며 독립 된 파일 에서 정의 해 야 합 니 다.
    다음으로 전송:https://juejin.im/post/5cfc638a6fb9a07ed74070f8

    좋은 웹페이지 즐겨찾기