범위 JS 문제를 이해하기 위해서, 우리는 먼저 브라우저가 스크립트 스크립트 코드를 읽어 JS 파서 브라우저, JS 파서 작업을 시작하는 방법을 이해해야합니다. 그 작업 단계는 두 부분으로 나누어 져 있습니다 :
JS 파서 :
1. "찾기 뭔가"(사전 구문 분석) : var에 함수 매개 변수
예 :
경고 (A); //찾으시는 주소가 없습니다
A는 1 =있다;
경고 (A); //1
기능을 Fn1 () {경고 (2)}
JS 파서 먼저 VAR 함수 매개 변수를 사전 분석입니다 찾을 수 있습니다.
정의되지 않은 A =으로 해결 var에 정의 된 변수을 발견했을 때, 특정 값을 읽지 않습니다. 즉, 모든 변수 공식 실행하기 전에 미리 모든의 값을 할당 - 정의되지 않은.
읽기 연료 소모량이에 해결 :을 Fn1 = 기능을 Fn1 () {경고 (2);}. 공식 코드를 실행하기 전에 모든 기능, 전체 기능 블록
라인별로 코드 라인의 2. 해석 :
이 팝업 있도록 코드를 읽는 형식 JS JS 파서는, 첫째, 얻은 사전 분석 결과를 읽 첫 번째 정규 정의되지 않은, 공식적으로 사전이-해결 때 = 1, 그 다음, 얻어진 값을 수정합니다 읽을 때 팝업 1의 값에.
예 :
1
경고 (A); // 주어진
A = 1;
1
참고 : var에 성명이 없기 때문에 값이 미리 분석 이하이며, 브라우저는 불평 공식적인 독서에게 코드를 찾을 수 없습니다.
여기에 점차 범위의 이해를 심화 몇 가지 구체적인 예는 다음과 같습니다
예 :
경고 (A); // 함수 A () {경고 (4)}
A는 1 =있다;
경고 (A); //1
A () {경고 (2)} 작동
경고 (A); //1
A가 3 =이있다;
경고 (A); //삼
A () {경고 (4)} 작동
경고 (A); //삼
A (); // 오류, 파서는 마지막 3을 저장하는 것입니다
분석 :
과정을 사전은-해결 :
A = ...,
A =는 () {경고 (2)} 작동
A = ...,
A =는 () {경고 (4)} 작동
주 : 브라우저 먼저 상기와 같이 미리 분석 결과를 분석하는 프리. 동일한 이름의 미리 파싱 발생 변수와 함수시 브라우저 함수 떠날 때, 동일한 이름의 복수의 기능의 얼굴을, 함수 선언 후 떠날 것이다. 공식 코드를 읽을 때, 그것은 사전 분석 값이 표현은 사전 분석의 값을 변경할 것을 명심 때 저장 수정합니다,하지만 함수 선언은 사전 분석의 값을 수정하지 않습니다.
예 :
A는 1 =있다;
기능을 Fn1 () {
경고 (A);
2가있다;
}
을 Fn1 (); //찾으시는 주소가 없습니다
경고 (A); //1
분석 :
Preresolution A는 정의되지는 =;
을 Fn1 = 기능을 Fn1 () {
경고 (A);
2가있다;
}
진보적 인 코드 읽기 : A는 1 =;
Preresolution A는 정의되지는 =;
진보적 인 코드 읽기 : A는 2 =을;
상술 한 바와 같이이 미리 파싱 정규 세션 회, 변수 함수, 팝업 (1)의 최종 값에서 함수 내에서만 작동을 정의.
예 :
A는 1 =있다;
기능을 Fn1 () {
경고 (A);
A = 2;
}
을 Fn1 (); //1
경고 (A); // 2
분석 : VAR 선언에 함수를 사전에 분석 함수의 정보를 찾을 수 없습니다, 여기에 사용되지 않습니다, 그것은 범위라고 범위 체인, A = 1 중 점프를 찾습니다.
예 :
A는 1 =있다;
기능을 Fn1 (a) {
경고 (A);
A = 2;
}
을 Fn1 (); //찾으시는 주소가 없습니다
경고 (A); //1
분석 : 때 함수 파라미터에 대응 VAR A = ..., A =는 preresolved 정의 함수이므로
1. 사전 분석 :
A = ...,
기능을 Fn1 (a) {
경고 (A);
A = 2;
}
2. 코드 라인을 읽기 :
글로벌 A = 1;
함수 호출하십시오 ... = 중고 파싱, 코드 A = 2 시브를 판독하지만, 외부 전역 변수 상수 값의 함수
예 :
A는 1 =있다;
기능을 Fn1 (a) {
경고 (A);
A = 2;
}
을 Fn1 (a); // 1 :이 파라미터는 총량으로부터 유도되는 = 1;
경고 (A); //1
참고 : 매개 변수 1의 값은 함수 동안, 함수 매개 변수가 코드를 읽기 시작하기 시작합니다.