'당신 이 모 르 는 자바 script (상)' 역할 영역 과 패키지 닫 기 (2)

3889 단어
라 는 책의 중간 권 목록 을 뒤 져 본 후에 책 에서 폐쇄, 대상, 원형, 문법, 비동기, 반전 등 기초 적 이 고 중요 한 자바 script 지식 에 대해 목적 성 있 게 논술 한 것 을 발견 하여 이 책의 중간 권 을 공부 하기 로 결정 했다.상권 과 중권 은 각각 두 가지 지식 을 다 루 었 는데 그것 이 바로 작용 역 과 폐쇄, this 와 대상 의 원형, 유형 과 문법, 비동기 와 성능 이다.본 고 는 역할 영역 과 폐쇄 에 대한 학습 총화 이다.
역할 영역 과 관련 지식 에 대한 이 해 는 주로 이러한 것들 을 파악 한다 고 생각 합 니 다. js 가 사용 하 는 역할 영역의 유형, IIFE 와 역할 영역 에서 의 향상 입 니 다.
1. 역할 영역 유형 역할 영역 은 품사 역할 영역 과 동적 역할 영역 으로 나 뉘 는데 js 는 품사 역할 영역 을 사용한다.이른바 어법 작용 역 이란 번역 어법 분석 단계 에서 어법 단원 에 따라 확 정 된 작용 역 을 가리 키 며 엔진 실행 코드 단계 의 작용 역 은 변 하지 않 는 다 (대부분 상황 에서). 괄호 안의 대부분 상황 을 주의한다. 왜냐하면 통상 적 으로 문법 에 대한 학습 에서 일반적인 상황 에 부합 되 지 않 는 상태 만 주의 하면 문법 에 대한 파악 이 훨씬 순 조 롭 기 때문이다.일부 코드 를 실행 하 는 동안 역할 영역 을 바 꾸 는 경우 (책 에서 '사기' 라 고 함) 는 두 가지 입 니 다. js 에서 eval () 과 with () 방법 (비 엄격 모드 에서) 을 사 용 했 습 니 다.
  • eval () 은 하나의 문자열 을 매개 변수 로 받 아들 일 수 있 고 코드 를 실행 하 는 동안 매개 변수 에서 전달 할 수 있 는 값 을 eval () 이 있 는 위치 에 있 는 코드 로 볼 수 있 습 니 다.
  • with () 의 주요 역할 은 한 대상 을 받 아들 이 고 그 중의 속성 을 신속하게 인용 하 는 것 이다.그러나 with () 는 이 대상 을 처리 할 때 새로운 역할 영역 을 형성 할 뿐만 아니 라 원래 존재 하 는 품사 역할 영역 도 바 꿀 수 있다 (이 방법 은 비교적 복잡 하 다).

  • eval () 에 예 를 들 면:
    function foo(str,a) {
      eval(str);
      console.log(a,b);
    }
    var b = 2;
    foo("var b = 3",1);//1,3
    

    foo ("var b = 3", 1) 문 구 를 실행 할 때 정상 적 인 상황 에서 함수 foo (str, a) 가 console. log (a, b) 로 실 행 될 때 b 를 찾 으 면 전체 변수 중의 b 를 찾 아 2 를 얻 지만 실제 적 으로 3 을 얻 을 수 있 습 니 다. 이것 은 eval () 이 "var b = 3" 을 함수 foo (str, a) 의 코드 로 보고 함수 에서 b 를 부분 변수 로 설명 한 것 과 같 기 때문에 다음 문장 console. log (a, b)실행 할 때 부분 변 수 를 찾 아 값 3 을 얻 으 면 검색 이 끝 나 며 전체 변 수 는 b 가 차단 되 었 습 니 다.엄격 한 모드 에서 eval () 은 자신의 역할 영역 이 있 고 그 함수 에서 차단 효과 가 발생 하지 않 으 며 with () 는 비활성화 되 어 있 습 니 다.또한 제1장 에서 말 했 듯 이 엔진 은 성능 을 최적화 할 때 이미 확 정 된 역할 영역 과 품사 단원 에 따라 최적화 되 었 다. eval () 과 with () 를 사용 한 후에 함수 역할 영역 은 동태 적 인 상황 에서 (코드 를 실행 하 는 동안) 변 화 될 수 있 고 엔진 은 이 두 가지 방법 을 만난 후에 성능 최적화 가 되 지 않 는 다.따라서 js 에서 이 두 가지 방법 을 사용 하면 성능 이 떨어진다.
    품사 역할 영역 에 대해 그 중에서 블록 역할 영역 과 함수 역할 영역 으로 나 뉘 었 다. js 는 대부분 상황 에서 함수 역할 영역 을 사용 하지만 개별 블록 역할 영역 이 존재 할 때 with () 와 try ~ catch 문 구 를 사용 할 때 블록 역할 영역 (또는 with () 이 형성 된다. 여기 서 제3 판 제4 장 에서 도 with () 는 역할 영역 을 형성 하지만에서 언급 한 바 와 같이 이러한 상황 으로 인해 역할 영역 체인 이 길 어 졌 고 with () 는 함수 역할 영역 을 형성 했다. 또한 ES6 가 나 온 후에 블록 역할 영역의 존재 와 사용 을 공식 적 으로 인정 했다. {} 에서 let 와 const 성명 을 사용 하면 블록 역할 영역 을 만 들 수 있 는데 이것 은 순환 문 구 를 사용 하 는 데 큰 편 의 를 제공 했다.
    2. IIFE IIFE 는 함수 표현 식 을 즉시 실행 합 니 다.먼저 함수 표현 식 이 무엇 인지 이해 해 야 합 니 다. 매우 간단 합 니 다. function 단 어 를 시작 으로 하 는 것 은 함수 성명 입 니 다. function 이 있 지만 그 시작 문 구 는 함수 표현 식 이 아 닙 니 다. 가장 전형 적 인 상황 은 (function () {} 입 니 다.함수 성명 과 함수 표현 식 이 같은 부분 은 함수 역할 영역 을 형성 하 는 데 있 으 며, 서로 다른 부분 은 함수 성명 이 향상 되 고 표현 식 이 향상 되 지 않 습 니 다.함수 표현 식 의 주요 역할 은 함 수 를 익명 으로 하 는 것 입 니 다. 그러면 함수 역할 영역 에 식별 자가 하나 더 나 오 는 것 을 피 할 수 있 습 니 다.그러나 모든 상황 에서 익명 이 가장 좋 은 것 은 아니다. 예 를 들 어 함수 가 한 번 만 호출 되 는 것 이 아니 라 익명 을 할 수 없다.함수 표현 식 의 또 다른 주요 역할 은 IIFE 로 나타 나 는 것 입 니 다. (function () {}) () 또는 (function () {} () 형식 으로 호출 하거나 불 러 오지 않 고 함 수 를 즉시 실행 할 수 있 습 니 다.IIFE 에서 많이 나 오 는 괄호 는 함수 만 즉시 실행 하 는 것 이 아니 라 괄호 에서 필요 한 인 자 를 전달 할 수 있 습 니 다.예 를 들 어 (function (a, b) {}) (c, d) 의 형식 으로 매개 변 수 를 함수 에 전달 할 수 있 지만 간단 한 함수 표현 식 (function () {}) 에는 이러한 기능 이 없습니다.그 밖 에 IIFE 는 폐쇄 체제 의 가장 좋 은 실천 (폐쇄 체 제 를 가장 잘 나타 내 는 방식 은 아니 지만) 으로 세 번 째 부분의 폐쇄 에서 말 할 것 이다.
    3. 역할 영역 에서 의 향상 은 실제 역할 영역 에서 의 향상 이 매우 간단 합 니 다. js 의 컴 파일 원 리 를 이해 할 수 있다 면 컴 파일 러 작업 단계 에서 성명 을 하고 다른 문 구 를 엔진 으로 실행 하 는 코드 를 형성 할 것 입 니 다. 따라서 작 성 된 코드 에서 하나의 역할 영역 에서 의 성명 이 어디 에 있 든 할당 등 다른 문장 보다 먼저 완 성 될 것 입 니 다.한편, js 문장의 집행 은 위 에서 아래로 실 행 된 것 이다. 이것 은 성명 을 아래 에서 함수 중 가장 위 에 있 는 곳 으로 통일 시 킨 것 과 같다. 이것 을 성명 이 라 고 한다.향상 에 대해 파악 해 야 할 요점 은 다음 과 같은 세 가지 가 있다.
  • 함수 표현 식 은 향상 되 지 않 습 니 다.
  • let 와 const 성명 은 향상 되 지 않 습 니 다.
  • 함수 성명 은 변수 성명 의 위로 올 라 가 고 같은 역할 영역 에서 같은 이름 의 함 수 를 설명 할 때 같은 이름 의 함수 가 올 라 갈 때 이전 함수 의 성명 을 덮어 씁 니 다.

  • Small Star 's Blog | 샛별 의 블 로그

    좋은 웹페이지 즐겨찾기