소위 범위는 단순히 읽고 쓸 수있는 범위 (영역)로 이해할 수 있습니다. JS에서 경험이있는 일부 학생들은 "JS는 블록 수준 범위가 없습니다"라고 말할 수 있습니다. 글로벌 범위 외에도 기능 만 스코프를 생성 할 수 있습니다. 범위의 한 가지 장점은 변수를 분리 할 수 있다는 것입니다.
우리는 JS의 범위를 이해하는 데 도움이되는 몇 가지 예를 사용합니다.
경고 (a); var a = 1;
범위를 전혀 모르는 학생들은 경고가 1이라고 말하거나 오류를보고 할 수 있습니다. 그러나 실제로 정의되지 않았습니다.
이에 대해 말하면, JS가 코드를 라인별로 구문 분석하기 전에 만들어진 일부 준비에 대해 먼저 이야기 해 봅시다.
코드를 한 줄씩 읽기 전에 JS는 "사전 전달"작업을 수행하고 미리 "작은 것"을 찾을 것입니다. 물론 "JS Parser"는 일부 데이터를 자연스럽게 찾을 수 없으며 Var, 기능 및 매개 변수에 따라 찾을 수 있습니다.
"JS Parser"는 상대적으로 "게으른"입니다. 공식적으로 코드를 실행하기 전에 Var가 선언 한 변수를 정의되지 않은 것으로 지정합니다. 코드의 양에 관계없이 전체 기능을 코드 블록으로 간주합니다. 매개 변수는 나중에 예제에 표시됩니다.
모든 준비가 완료된 후 "JS 파서"는 코드를 라인별로 실행하기 시작합니다. 이제 우리가 시작한 예제를 분석하고 왜 정의되지 않은지 이해하기 쉽습니다.
다음 예를 살펴 보겠습니다
경고 (a); var a = 1; 경고 (a); var a = 2; 경고 (a);
이것을 조금 분석합시다
첫 번째 "준비": 파서는 var를 찾습니다
두 번째 줄 a = 정의되지 않은;
네 번째 줄을 읽을 때 여전히 a = 정의되지 않았습니다.
공식 라인별 코드 실행 :
첫 번째 줄 알림 : 정의되지 않았습니다
두 번째 줄 a = 1;
3 행 경보 : 1;
다섯 번째 요소 경고 : 2
아래 예를 살펴 보겠습니다
경고 (a); var a = 1; 경고 (a); 함수 a () {alert (2); } 경고 (a); var a = 3; 경고 (a); 함수 a () {alert (4); } 경고 (a);이것을 조금씩 분석합시다
첫째, "사전 시간": 파서는 var 함수를 찾습니다.
두 번째 줄 a = 정의되지 않은;
네 번째 줄을 읽을 때 a = 함수 a () {alert (2);} // 모든 함수는 공식적으로 코드를 실행하기 전에 전체 함수 블록입니다. 변수가 중복 이름을 만나면 하나의 변수 만 남습니다. 변수와 함수가 중복 이름 인 경우 함수 만 남습니다.
여섯 번째 줄을 읽을 때 a = function a () {alert (2);}
여덟 번째 줄을 읽을 때 a = function a () {alert (4);}
공식 라인별 코드 실행 :
첫 번째 줄 알림 : 함수 a () {alert (4);}
두 번째 줄 a = 1; // 표현식은 사전 정당한 값을 수정할 수 있습니다!
3 행 경보 : 1;
네 번째 함수 라인은 호출되지 않습니다.
다섯 번째 요소 경고 : 1;
6 행 A = 3;
7 행 경보 : 3
여덟 번째 라인 함수는 호출되지 않습니다.
9 행 경보 : 3
그림과 같이 :
예를 계속보십시오.
var a = 1; 함수 fn1 () {alert (a); // 정의되지 않은 var a = 2;} fn1 (); 경고 (a); // 1첫 번째 "준비": 파서는 var 함수를 찾습니다
첫 번째 줄 A = 정의되지 않은;
두 번째 줄을 읽을 때 fn1 = function fn1 () {alert (2); var a = 2;}
코드의 공식 라인별 실행 : 첫 번째 줄 a = 1;
여섯 번째 라인 함수 호출은 함수 범위를 입력하고 함수 스코프에서 여전히 미리 부패한 다음 라인별로 실행합니다.
기능 내에서 준비하십시오 : a = 정의되지 않은;
실행 : 경고 : 정의되지 않은;
a = 2; //이 시점에서 A는 함수 범위에서만 A이며 글로벌에서 A에 영향을 미치지 않습니다.
함수가 실행되고 전역 범위로 돌아갑니다.
7 행 경보 : 1;
계속하다:
var a = 1; 함수 fn1 () {alert (a); // 1 a = 2;} fn1 (); 경고 (a); // 2위의 예의 유일한 차이점은 기능의 A에 Var가 없으며 핵심 사항 만 분석한다는 것입니다.
세 번째 줄 알림 (a)에서 함수 스코프에서 함수에 var a가 없기 때문에 "파서"는 함수의 범위의 상위 수준 범위를 찾습니다 (상위 수준 및 하위 수준 관계의 결정은 함수가 생성 된 범위에 달려 있으며, 스코프가 발생하는 스코프는 범위가 낮은 범위에 달려 있습니다). 현재 함수의 상위 레벨은 글로벌 범위입니다. 글로벌 범위에서 a = 1이므로 현재 세 번째 줄 알림 : 1, 네 번째 줄은 값을 할당하고 여전히 함수 스코프에는 A가 없으므로 A a는 A a a a a a the a a a a a a a a modifify a를 찾으므로 전역 스코프에서 a를 수정합니다.
이 시점은 명확하게 이해되어야하며 VAR의 차이에주의를 기울여야합니다.
다음:
var a = 1; 함수 fn1 (a) {alert (a); // 정의되지 않은 a = 2; } fn1 (); 경고 (a); // 1이 예와 이전 예제의 차이점은 추가 매개 변수가 있다는 것입니다. 매개 변수의 함수는 로컬 변수와 동일합니다. 즉, 함수의 사전 준비에 var a = 정의되지 않습니다. 따라서 세 번째 줄 알림 : 정의되지 않았으며 네 번째 줄 a = 2는 함수 스코프의 A를 변경하여 전역 컨텍스트에서 A에 영향을 미치지 않습니다. 일곱 번째 줄 알림 : 1;
그 다음에:
var a = 1; 함수 fn1 (a) {alert (a); // 1a = 2;} fn1 (a); 경고 (a); // 1이 예는 이전 예제와 다소 다릅니다. 함수가 여섯 번째 줄에서 호출되면 매개 변수가 전달됩니다. 6 번째 라인 함수의 실제 매개 변수 A는 전역 변수 a = 1의 1입니다. 함수가 실행되면 두 번째 줄 A = 1이므로 세 번째 줄 알림 : 1 및 일곱 번째 줄 알림 : 1.
이 예제의 차이점에주의를 기울이고 혼동하지 마십시오.
다른 하나 :
var a = 1; 함수 en () {var a = 2; fn ();} 함수 fn () {alert (a); // 1} en ();FN의 A는 선언되지 않았으며 함수가 생성되는 범위에서 값을 가져와야합니다. 함수의 범위를 "호출"하는 것이 아니라 "생성"됩니다.
추신 : JavaScript의 범위 및 컨텍스트 개념
JavaScript의 범위와 컨텍스트는이 언어에 고유합니다. 각 함수마다 변수 컨텍스트와 범위가 다릅니다. 이러한 개념은 JavaScript의 강력한 디자인 패턴으로 뒷받침됩니다. 그러나 이것은 또한 개발자들에게 큰 혼란을 초래합니다. 다음은 JavaScript의 컨텍스트와 범위의 차이와 다양한 설계 패턴이 사용하는 방법을 완전히 보여줍니다.
컨텍스트 대 범위
첫 번째 질문은 컨텍스트와 범위가 다른 개념이라는 것입니다. 수년에 걸쳐 많은 개발자들이 종종이 두 용어를 혼동하여 서로를 잘못 설명한다는 것을 알았습니다. 공정하게 말하면,이 용어는 매우 혼란스러워졌습니다.
각 함수 호출에는 범위와 컨텍스트와 관련된 컨텍스트가 있습니다. 기본적으로 범위는 기능 기반이며 컨텍스트는 객체 기반입니다. 다시 말해, 범위는 함수가 호출 될 때마다 변수에 액세스하는 것과 관련이 있으며 각 호출은 독립적입니다. 컨텍스트는 항상 키워드의 값입니다. 이것은 현재 실행 가능한 코드를 호출하는 객체에 대한 참조입니다.
위는 편집자가 소개 한 JavaScript의 범위입니다 (권장). 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!