이전 단어
대부분의 경우, 범위에 대해 혼란스러워하는 주된 이유는 가변 검색이 중첩 된 기능 위치 또는 기능 호출 순서로 수행되어야하는지 여부를 구별 할 수 없기 때문입니다. 이 메커니즘의 간섭과 함께 가변 검색은 오류가 발생하기 쉽습니다. 이것은 실제로 두 가지 스코프 작업 모델로 인해 발생합니다. 범위는 어휘 범위와 동적 범위로 나뉩니다. 이 두 가지 범위 모델을 구별하면 변수 검색 프로세스를 명확하게 이해할 수 있습니다. 이 기사
어휘 범위
첫 번째 기사에서 언급했듯이 컴파일러의 첫 번째 작업 단계는 Word Partiplle이라고하며 문자로 구성된 문자열을 어휘 단위로 분해합니다. 이 개념은 어휘 범위를 이해하기위한 기초입니다.
간단히 말해, 어휘 스코프는 어휘 단계에서 범위를 정의하며, 이는 코드를 작성할 때 변수와 블록 범위가 작성되는 위치에 따라 결정됩니다. 따라서 어휘 분석기가 코드를 처리 할 때 범위는 변경되지 않습니다.
관계
함수가 어디에서 호출 되더라도 호출되는 방식에 관계없이 어휘 스코프는 함수가 선언 된 위치에 의해서만 결정됩니다.
함수 foo (a) {var b = a * 2; 함수 바 (c) {console.log (a, b, c);} bar (b * 3);} foo (2); // 2 4 12이 예에는 세 개의 중첩 스코프가 있습니다. 이해하는 데 도움이 되려면 단계별로 포함 된 여러 거품으로 생각하십시오.
스코프 버블은 해당 스코프 블록 코드가 작성되는 위치에 따라 결정되며 단계별로 포함됩니다.
Bubble 1에는 전체 글로벌 범위가 포함되어 있으며 하나의 식별자 만 포함합니다.
Bubble 2에는 FOO가 만든 범위가 포함되어 있으며, 여기에는 세 가지 식별자가 있습니다 : A, Bar 및 B
Bubble 3에는 하나의 식별자 만있는 Bar에 의해 생성 된 범위가 포함되어 있습니다.
찾다
스코프 버블의 구조와 위치 관계는 엔진이 충분한 위치 정보를 제공하며 엔진은 식별자의 위치를 찾는 데 사용합니다.
코드 스 니펫에서 엔진은 Console.log (...) 선언을 실행하고 세 가지 변수 A, B 및 C에 대한 참조를 찾습니다. 먼저 가장 안쪽 범위, 즉 막대 (...) 함수의 범위로 시작합니다. 엔진은 여기를 찾을 수 없으므로 중첩 된 foo (...)의 범위에서 계속 검색하기 위해 이전 레벨로 이동합니다. A는 여기에 있습니다. 따라서 엔진은이 참조를 사용합니다. b도 마찬가지입니다. 그리고 C의 경우 엔진이 막대에서 발견했습니다 (...)
[참고] 어휘 스코프 검색은 1 단계 식별자 만 찾습니다. 코드가 foo.bar.baz를 참조하면 어휘 스코프 검색에서 foo 식별자 만 찾으려고합니다. 이 변수를 찾은 후 객체 속성 액세스 규칙은 각각 BAR 및 BAZ 속성에 대한 액세스를 취합니다.
foo = {bar : {baz : 1}}; console.log (foo.bar.baz); // 1씌우다
스코프 검색은 런타임이 위치한 가장 안쪽 범위에서 시작하여 첫 번째 일치 식별자가 충족 될 때까지 바깥 쪽 또는 위로 단계적으로 진행됩니다.
동일한 이름을 가진 식별자는 다층 중첩 스코프로 정의 될 수 있으며, 이는 "폐색 효과"라고합니다. 내부 식별자는 "외부 식별자"외부 식별자
var a = 0; function test () {var a = 1; console.log (a); // 1} test ();글로벌 변수는 글로벌 객체의 자동으로 속성이므로 글로벌 객체의 어휘 이름을 직접 통과하는 대신 글로벌 객체의 속성을 참조하여 직접 액세스 할 수 있습니다.
var a = 0; function test () {var a = 1; console.log (Window.a); // 0} test ();이 기술을 사용하면 동일한 이름의 변수에 의해 가려진 전역 변수에 액세스 할 수 있습니다. 그러나 비 글로벌 변수가 차단되면 무엇이든지 상관없이 액세스 할 수 없습니다.
동적 범위
JavaScript는 어휘 범위를 사용하며 가장 중요한 기능은 코드의 쓰기 단계에서 정의 프로세스가 발생한다는 것입니다.
그렇다면 왜 동적 범위를 도입합니까? 실제로, 동적 범위는 이것을 사촌에 대한 자바 스크립트의 또 다른 중요한 메커니즘입니다. 범위의 대부분의 혼란은 어휘 범위 와이 메커니즘이 혼란스러워서 바보 같은 차이를 말할 수 없기 때문입니다.
다이나믹 스코프는 기능과 스코프가 어떻게 선언되고, 어디서나 호출되는 곳에서만 선언되는 방법에 대해 신경 쓰지 않습니다. 다시 말해, 스코프 체인은 코드의 스코프 중첩이 아닌 통화 스택을 기반으로합니다.
var a = 2; function foo () {console.log (a);} function bar () {var a = 3; foo ();} bar ();[1] 어휘 범위에 있다면 현재 JavaScript 환경입니다. 변수 a는 먼저 foo () 함수에서 검색되지만 찾을 수 없습니다. 따라서 스코프 체인을 따라 글로벌 범위에서 검색하고 2의 값을 찾고 할당합니다. 따라서 콘솔 출력 2
【2 it 동적 범위 인 경우 마찬가지로 변수 A는 먼저 foo ()에서 검색되어 찾을 수 없습니다. 여기에서는 콜 스택을 따라 foo () 함수가 호출되는 장소, 즉 bar () 함수, 값을 3으로 찾아 지정합니다. 따라서 콘솔 출력 3.
요약 : 두 범위의 차이. 요컨대, 어휘 스코프는 정의 시간에 결정되는 반면, 동적 범위는 런타임에 결정됩니다.
위는 편집자가 소개 한 어휘 범위와 동적 범위의 두 번째 부분입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 더 알고 싶다면 Wulin.com에주의를 기울이십시오!