JavaScript 프로그램의 각 바이트는이 실행 컨텍스트에서 실행됩니다. 이러한 맥락을 코드의 이웃으로 생각할 수 있으며, 이는 각 코드 라인을 나타내며, 어디에서 왔는지, 친구 및 이웃 인 사람을 나타낼 수 있습니다. 그렇습니다. JavaScript Society는 누가 누구와 상호 작용할 수 있는지를 규정하는 매우 엄격한 규칙을 가지고 있기 때문에 이것은 매우 중요한 정보입니다. 운영 컨텍스트는 그 안에 열린 작은 문 대신 문이있는 커뮤니티입니다.
우리는 일반적으로 이러한 사회적 경계를 범위라고 언급 할 수 있으며 각 이웃의 헌장에서 입법에 충분히 중요합니다. 이것은 우리가 이야기하고자하는 맥락의 범위 체인입니다. 특정 이웃 관계 내에서 코드는 스코프 체인 내에서만 변수에 액세스 할 수 있습니다. 이 코드는 이웃을 넘어서는 변수와 비교하여 지역 (지역, 즉 지역)을 다루는 것을 선호합니다.
모든 프로그래밍 언어에는 범위가 있습니다. 간단히 말해서, 범위는 접근 가능한 변수 및 함수 범위, 즉 범위가 변수 및 함수의 가시성 및 수명주기를 제어합니다. JavaScript의 범위는 항상 프론트 엔드 개발에서 이해하기 어려운 지식 지점이었습니다. JavaScript의 범위를 쉽게 해결하기 위해 몇 마디를 기억하십시오.
1. "JavaScript의 블록 레벨 범위 없음"
Java 또는 C#에는 블록 레벨 범위가 있습니다. 즉, 버팀대도 범위입니다.
public static void main () {if (1 == 1) {문자열 이름 = "7"; } system.out.println (이름);} // 오류를보고합니다 public static void main () {if (1 == 1) {문자열 이름 = "7"; } console.writeline (이름);} // 오류를보고합니다JavaScript의 블록 수준 범위가 없습니다
함수 main () {if (1 == 1) {var name = '7'; } console.log (이름);} // 출력 : 72. JavaScript는 함수 범위를 채택합니다
JavaScript에서 각 기능은 범위로 작용하며 내부 범위의 변수는 외부에서 액세스 할 수 없습니다.
함수 main () {var innerValue = '7';} main (); Console.log (InnerValue); // ERROR : Uncaked ReferenceError : InnerValue가 정의되지 않았습니다3. JavaScrip 스코프 체인
JavaScript의 각 함수는 범위이므로 함수 중첩 함수가 나타나면 스코프 체인이 나타납니다.
xo = 'Alex'; 함수 func () {var xo = "7"; 함수 내부 () {var xo = 'Alvin'; Console.log (xo); } inner ();} func ();예를 들어, 위의 코드는 3 개의 스코프로 구성된 스코프 체인에 나타납니다. 스코프 체인이 나타나면 변수를 찾을 때 순서가 나타납니다. 위의 예를 위해 :
Console.Log (XO)가 실행되면 검색 순서는根据作用域链从内到外검색하는 것입니다. 내부 층이 존재하지 않으면 예외가 발견되지 않을 때까지 점차적으로 조회됩니다.
4. JavaScript의 스코프 체인은 실행 전에 생성되었습니다
JavaScript의 범위는 실행되기 전에 생성되었습니다. 미래에 실행되면 스코프 체인에 따라 검색하면됩니다.
Example 1:
xo = 'Alex'; 함수 func () {var xo = "7"; 함수 내부 () {console.log (xo); } return 내부;} var ret = func (); ret (); // 출력 결과 : 7위의 코드는 함수가 호출되기 전에 이미 존재합니다.
글로벌 범위 -> func 함수 범위 -> 내부 함수 범위
[ret ();]을 실행할 때 내부 함수를 지칭하기 때문에이 함수의 스코프 체인은 다음과 같이 정의되었습니다. Global Scope-> func function scope -> 내부 함수 스코프, [ret ();]을 실행할 때 기존 범위 체인을 기반으로 변수가 발견됩니다.
Example 2:
xo = 'Alex'; function func () {var xo = "eirc"; 함수 내부 () {console.log (xo); } xo = '7'; 내부;} var ret = func (); ret (); // 출력 결과 : 7위의 코드는 예 1과 동일한 목적을 가지며, 또한 함수가 다음과 같은 범위 체인이 이미 존재한다는 것을 강조합니다.
글로벌 범위 -> func 함수 범위 -> 내부 함수 범위
다르게, [var ret = func ();]을 실행할 때 func 스코프의 XO 변수의 값은 "Eric"에서 "7"으로 재설정되었으므로 [ret ();]를 실행할 때는 "7"만 찾을 수 있습니다.
Example 3:
xo = 'alex'; function bar () {console.log (xo);} function func () {var xo = "7"; return bar;} var ret = func (); ret (); // 출력 결과 : Alex위의 코드에서는 함수가 실행되기 전에 두 개의 스코프 체인이 생성되었습니다.
글로벌 범위 -> 바 기능 범위
글로벌 범위 -> func 함수 범위
[ret ();]를 실행할 때 Ret는 막대 함수를 지칭하고 막대 함수의 스코프 체인이 이미 존재합니다. Global Scope-> Bar Function Scope, 실행시 기존 스코프 체인을 기반으로 검색됩니다.
5. 미리 진술
변수를 생성하지 않고 JavaScript에서 직접 사용하면 오류 가보고됩니다.
console.log (xxoo); // 오류 : upphed 참조 우리 : xxoo는 정의되지 않았습니다
JavaScript에서 값을 할당하지 않고 값이 생성되면 값은 다음과 같이 정의되지 않습니다.
var xxoo; console.log (xxoo); // output : 다음과 같이 작성된 경우 함수에서 정의되지 않았습니다 : function foo () {console.log (xo); var xo = 'seven';} foo (); // output : undefined위의 코드는 오류를보고하지 않지만 정의되지 않은 출력. 그 이유는 JavaScript 함수가 실행되기 전에 값을 할당하지 않고 모든 변수를 선언하기 때문입니다. 따라서, "사전 컴파일"할 때 함수가 이미 VAR XO를 실행 한 것은 위의 예와 같습니다. 따라서 위의 코드의 출력은 정의되지 않았습니다.
JS는 매우 흥미로운 언어입니다. 많은 기능이 HTML에서 DOM의 작동을 목표로하기 때문에 캐주얼하고 약간 덜 엄격 해 보입니다. 그러나 프론트 엔드의 지속적인 번영과 개발과 노드의 상승으로 인해 JS는 더 이상 jQuery 시대의 "장난감 언어"또는 "CSS 확장"이 아닙니다. 이 기사에서 언급 한 것은 전통적인 웹 개발을 겪은 초보자와 JS 개발자들에게 혼란스러워 지거나 오해가 쉽습니다. 이 기사가 도움이되기를 바랍니다.