리뷰 요약: 함수 범위와 블록 범위의 동작은 동일합니다. 특정 범위에서 선언된 모든 변수는 이 범위에 연결됩니다.
1. 이제 두 가지 질문을 하고 다음 두 가지 코드를 제공합니다. 먼저 출력 결과를 생각한 다음 의심이 생길 것입니다.
//第一段代码 a=2; var a; console.log(a); //第二段代码 console.log(a); var a=2;
2. 결과는 다음과 같습니다. 첫 번째 코드 조각의 결과는 미달이고, 브라우저에서 실행한 결과는 2입니다. 2이지만 브라우저에서 실행한 결과는 미약합니다. 형제! 이것이 사실입니까(그렇지 않더라도 다른 형태의 잘못된 추측을 하고 있는 것 같습니다).
3. 첫 번째 코드의 결과가 2이고 두 번째 코드의 결과가 정의되지 않은 이유를 설명하겠습니다. 먼저 var a=2인 코드는 두 개의 코드 조각처럼 보입니다. JS: var a 및 a=2; 전자는 컴파일 타임에 실행되고 후자는 런타임에 실행되므로 질문이 발생합니까? 프로그램이 실행되기 전에 변수와 함수의 선언이 처리되는데, 코드의 실행 순서는 여전히 보시는 쓰기 순서인가요?
4. 첫 번째 코드의 경우 코드의 두 번째 줄인 var a가 컴파일 중에 먼저 처리되고, 첫 번째와 세 번째 줄이 런타임에 처리됩니다. 그러면 전체 코드의 처리 형식은 다음과 같습니다. 바라보다! 이렇게 이해하시면 됩니다. 오! 먼저 선언하고 할당한 후 인쇄하세요.
5. 같은 이유로 두 번째 코드 부분은 다음과 같이 처리됩니다.
//第一段代码被JS这样的顺序处理了 var a; a=2; console.log(a);
A는 컴파일 중에 선언되었지만 실행 중에는 console.log(a)가 실행되기 전에 a가 존재하지 않습니다. 값이 할당되어 인쇄되면
6. 그래서 JS에서 코드를 처리할 때
코드의 변수 및 함수 선언 위치가 범위의 맨 위로 이동되는 것 같습니다. 이는 컴파일 과정에서 선언됩니다. 우선적으로 개선하는 과정입니다! 2. 각 범위가 승격됩니다
//第二段代码被JS以这样的形式处理: var a; console.log(a); a=2;
전역 범위는 foo 함수 선언을 승격하고, foo 범위에서는 다음과 같이 처리 형식을 승격합니다. :
foo(); function foo(){ console.log(a); var a=2; }
2. 특별 참고 사항:
함수 선언은 승격되지만 함수 표현식은 승격되지 않습니다. 이름이 지정된 함수 표현식의 경우 할당 전 범위에서 이름 식별자를 사용할 수 없습니다. 이 두 문장은 무엇을 의미하나요? 다음 두 코드는 다음과 같습니다. function foo(){
var a;
console.log(a);
a=2;
}
foo();
이 코드가 개선되면 다음과 같습니다.
foo(); TypeError bar(); ReferenceError var foo=function bar(){ //.... }
foo에 대한 선언은 있지만 foo에 대한 할당은 없으며 foo는 정의되지 않습니다. 시간이 지나면 정의되지 않은 작업은 물론 작업 유형 오류입니다. 그리고 선언되지도 않은 bar가 foo의 함수 표현식에 선언되어 있으므로 선언되지 않은 오류입니다.
3. 승격용:
함수가 먼저 승격되고 변수가 승격됩니다. 관련 권장 사항:
JavaScript 범위 및 클로저에 대한 심층적인 이해JavaScript 범위 및 클로저에 대한 자세한 설명위 내용은 JavaScript의 범위 및 클로저에 대한 지식 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!