당신 이 모 르 는 자바 script 노트 (1) - 역할 영역 과 패키지
1.1 역할 영역 은 무엇 입 니까
1.1.1 컴 파일 원리 과정
js 의 코드 컴 파일 은 실행 전에 발생 합 니 다. 과정 은 다음 과 같 습 니 다.
1.1.2 RHS 와 LHS
RHS 는 어떤 변수의 값 을 찾 는 것 을 표시 합 니 다.LHS 는 변수 용기 자 체 를 찾 아 값 을 부여 하 는 것 을 말한다.
RHS 와 LHS 가 찾 을 때 현재 역할 영역 에서 목 표를 찾 지 못 하면 계속 위로 찾 아 순서대로 유추 합 니 다.
RHS 가 마지막 에 변수의 값 을 찾 지 못 하면 js 엔진 은 Reference Error 이상 을 던 집 니 다.
엄격 하지 않 은 모드 에서 LHS 가 용기 의 정 의 를 찾 지 못 하면 js 엔진 은 전역 역할 영역 에서 자동 으로 이 용 기 를 만 듭 니 다.
그러나 엄격 하지 않 은 모드 에서 도 엔진 은 Reference Error 이상 을 던 질 수 있다.
만약 당신 이 RHS 의 값 을 부적 절 하 게 조작 했다 면 엔진 은 TypeError 이상 을 던 질 것 입 니 다.
1.2 어법 작용 영역
품사 작용 도 메 인 은 품사 단계 에 정의 된다.
역할 영역 찾기 는 첫 번 째 일치 하 는 부 호 를 찾 을 때 중단 합 니 다.여러 겹 으로 포 함 된 동명 식별 자 는 내부 의 표지 부 호 는 외 부 를 가 릴 수 있다.
기만 어법 의 방식:
동적 생 성 코드
빠 른 접근 대상 내부 속성
품사 사기 결함: 컴 파일 단계 에서 진행 되 는 정적 최적화 가 잘못 되 고 성능 을 떨 어 뜨 릴 수 있 습 니 다.
1.3 함수 역할 영역 과 블록 역할 영역
이 함수 에 속 하 는 모든 변 수 는 전체 함수 범위 내 에서 사용 할 수 있 습 니 다.
1.3.1 내부 숨 기기 실현
이 변 수 는 새로 만 든 함수 의 역할 영역 에 연결 되 어 있 습 니 다.
명명 충돌 회피
1.3.2 함수 역할 영역
함수 성명 과 표현 식: function 이 처음 나타 난 것 은 함수 성명 이 고, 그렇지 않 은 것 은 함수 표현 식 입 니 다.
서명 과 익명
익명 함수
장점 은 바로 쓰기 가 빠 르 지만 단점 이 많다 는 것 이다.
함 수 를 () 감 싸 서 함수 표현 식 으로 만 들 고 이 어 뒤에서 직접 호출 합 니 다.
UMD 모듈 관리 에 서 는 실행 할 코드 를 매개 변수 에 거꾸로 두 고 즉시 실행 함수 에서 실행 하 는 것 입 니 다.
1.3.4 블록 역할 영역
with 에서 방문 한 대상 속성 은 현재 역할 에 만 존재 합 니 다.
catch 에서 블록 역할 영역 을 단독으로 형성 합 니 다.
설명 한 변 수 를 블록 역할 영역 을 자동 으로 납치 합 니 다.변수 향상 문제 도 없 을 것 이다.
let 를 통 해 for 순환 에서 적시에 변 수 를 얻 을 수 없 는 문 제 를 해결 할 수 있 으 며, let 납치 블록 역할 도 메 인 을 통 해 이미 사용 한 데이터 메모 리 를 방출 할 수 있 습 니 다.
함수 역할 영역 과 블록 역할 영역 은 모두 같 습 니 다. 모든 성명 이 역할 영역 에 있 는 변 수 는 이 역할 영역 에 부 속 됩 니 다.
1.4 승급
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.