최상위 코드, 즉 fn 내부에 없는 코드에 대한 전역 실행 컨텍스트 생성. 따라서 fn 외부의 코드가 먼저 실행됩니다.
fn-decln/exprsn의 fn 본문 내부 코드는 호출될 때만 실행됩니다.
JS가 실행되는 환경입니다.
일부 코드가 로컬 변수, fn에 전달된 인수처럼 실행되는 데 필요한 모든 정보를 저장합니다.
JS 코드는 항상 EC 내부에서 실행됩니다.
JS 프로젝트 규모에 상관없이 정확히 하나의 글로벌 EC입니다.
fn 내부에 없는 코드에 대해 생성된 기본 컨텍스트입니다.
그런 다음 코드는 전역 EC
내부에서 실행됩니다.
최상위 코드 실행 후 fns 실행 및 C/bs 대기
각 fn 호출에 대해 해당 fn을 실행하기 위해 새 EC가 생성됩니다. 메소드도 객체에 연결된 fns이므로 마찬가지입니다.
이러한 모든 EC가 함께 호출 스택을 구성합니다.
모든 fns가 실행되면 엔진은 CB가 도착하고 이를 실행하기를 기다립니다. 전. 이벤트 루프에서 제공되는 클릭 이벤트 콜백.
arguments 객체 : fn에 전달된 모든 인수를 EC에 저장합니다.
각 fn은 호출된 대로 자체 EC를 갖습니다. 그리고 선언된 변수는 변수 환경
범위 체인:
Fns는 범위 체인을 사용하여 fns 외부 변수에 액세스할 수 있습니다.
현재 fn 외부에 있는 변수에 대한 참조를 포함하고 범위 체인을 추적하기 위해 각 EC에 저장됩니다.
각 EC도 'this' 키워드를 얻습니다.
위의 세 가지 모두 실행 직전인 "생성 단계"에서 생성됩니다. 이는 최상위 수준에서 코드를 실행하는 데 필요한 것입니다.
우리는 인수 객체, 이 키워드를 갖지 않을 것입니다. Arrow fns는 위의 두 fn 중 가장 가까운 일반 fn을 사용합니다.
arguments: 화살표 fn이 아닌 일반 fn에 전달된 모든 인수를 포함하는 객체와 같은 배열입니다.
실행 중인 위치를 추적하기 위해 EC가 서로 쌓이는 위치입니다. 최상위 EC는 우리가 실행하고 있는 EC입니다. 실행이 끝나면 스택 상단에서 제거되고 제어권은 기본 EC로 전송됩니다.
중첩된 fn 호출이 있는 경우 JS에는 실행 스레드가 하나만 있으므로 호출 스택에서 내부 fn 실행 결과를 반환하기 위해 외부 fn 호출이 일시 중지됩니다. 이제 이전 EC가 활성 EC가 됩니다.
그런 다음 최상위 EC가 반환되면서 호출 스택에서 팝됩니다.
호출 스택에서 가장 낮은 것은 글로벌 EC이고, 맨 위에는 순서대로 발생하는 fn 호출이 됩니다.
실행 순서가 손실되지 않도록 보장합니다.
결국 프로그램은 종료되고 글로벌 EC도 콜스택에서 튀어나오게 됩니다.
Hence, we can say that each EC has: 1. Variable environment 2. Scope chain 3. 'this' keyword
JS 엔진이 프로그램 변수를 구성하고 액세스하는 방법
변수는 어디에 살고 있나요
특정 변수에 액세스할 수 있는 곳과 액세스할 수 없는 곳은 어디입니까?
JS에는 코드 내 fns 및 블록 배치에 따라 범위 지정이 제어되는 Leical 범위 지정이 있습니다.
전. 중첩된 fn은 상위 fn의 변수에 액세스할 수 있습니다.
특정 변수가 선언된 공간이나 환경(fns의 경우 변수 환경). fns EC에 저장되는 변수 env입니다.
fns의 경우 Var env와 범위는 모두 동일합니다.
Three scopes in JS are: 1. Global scope 2. Fn scope 3. Block scope [ES6]
범위는 변수가 선언되는 곳입니다. 따라서 fns는 변수에 저장된 값일 뿐이므로 Fns에도 해당됩니다.
특정 변수에 접근할 수 있는 코드 영역.
## Global Scope: For top level code For variables declared outside of any fn or block which are accessible from everywhere Variables in this scope are at the top of scope chain. Hence, can be used by every nested scope.
## Fn Scope: Each fn has creates its own scope Variables are accessible ONLY inside fn, NOT outside. Else Reference Error Also called local scope Fn decln, exprsn, arrow all three create their own scopes. Only way to create scope using ES5 which had only fn & global scope.
## Block Scope: Introduced in ES6, not only fn but {} also create a scope known as block scope which work only for ES6 variables i.e let-const types. DOesn't work for variables declared with 'var' as its fn scoped. Variables accessible only inside block i.e {} This only applies to variables declared with let-const only. Fns are also block scoped in ES6 (only in strict mode, should be used) variables declared using 'var' will be accessible outside the block Scoped to the current fn or the global scope. var variables only care about fn, they ignore blocks. They end up in nearest fn scope.
fn이 범위에서 변수를 찾지 못하면 범위 체인을 조회하여 외부 범위에서 변수를 찾습니다. 이 프로세스를 범위 체인의 변수 조회라고 합니다. 이는 반대 방향으로는 작동하지 않습니다. 즉, fn 또는 외부 범위 외부에서 중첩된 fn 변수 또는 범위에 액세스할 수 없습니다.
형제 범위는 서로의 변수에 액세스할 수 없습니다.
가장 안쪽 범위만 외부 범위에 액세스할 수 있으며 그 반대 범위에는 액세스할 수 없습니다.
fn이 호출되는 정확한 순서로 각 fn에 대한 하나의 EC는 EC 내부의 변수와 함께 호출 스택에 배치됩니다. Global EC는 Call Stack의 맨 아래에 있습니다.
스코프 체인:
코드에 fns가 작성되는 순서에 관한 것입니다.
fns가 호출된 순서와는 아무런 관련이 없습니다.
범위 체인은 EC에서 가변 환경을 가져옵니다.
fn 호출 순서는 스코프 체인과 전혀 관련이 없습니다.
const a = 'Alice'; first(); function first(){ const b = "Hello"; second(); function second(){ const c = "Hi"; third(); } } function third(){ const d = "Hey"; console.log(d c b a); // Reference Error } ## Call Stack order: third() EC - top second() EC first() EC global EC - bottom Scope Chain: second() --nested inside--> first() --nested inside--> global scope. third() is independently defined inside gloabal scope. Reference Error occurred because both 'c' as well as 'b' cannot be accessed using the scope chain.
요약:
E-C, Var Env, Cl-Sk, Scope, Scope-chain은 모두 다르지만 관련된 개념입니다.
범위 지정은 변수가 어디에 있는지, 변수에 액세스할 수 있는 위치와 액세스할 수 없는 위치에 대해 질문합니다.
JS의 어휘 범위 지정: 변수에 액세스할 수 있는 규칙은 fns 및 블록이 작성된 코드의 정확한 위치를 기반으로 합니다.
모든 범위는 모든 외부 범위의 모든 변수에 액세스할 수 있습니다. 일방통행인 스코프체인입니다. 외부 범위는 내부 범위의 변수에 절대 액세스할 수 없습니다.
특정 범위의 범위 체인은 모든 상위 범위의 모든 Var Env를 합한 것과 같습니다.
스코프 체인은 fns가 호출되는 순서와 아무 관련이 없습니다. 스코프 체인에는 전혀 영향을 미치지 않습니다.
현재 범위에서 변수를 찾을 수 없으면 엔진은 찾고 있는 변수를 찾을 때까지 범위 체인을 찾습니다. 이를 변수 조회라고 합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3