범위: 식별자가 선언된 위치는 다른 코드가 식별자 자체를 참조할 수 있는 범위를 결정합니다.
범위: 식별자가 유효한 영역
식별자 확인: JavaScript 엔진은 동일한 이름의 어떤 변수를 참조해야 하는지 결정합니다.
>>> 컨텍스트(실행 컨텍스트 관련)를 고려하여 JavaScript 엔진에서 결정
식별자: 구분하려면 고유해야 합니다.
그러나 같은 이름의 공간을 다른 공간에서 사용할 수 있습니다.
즉, 범위는 네임스페이스모두
영역 유형
전역: 코드의 가장 바깥쪽 영역, 전역 범위, 전역 변수
local: 함수 본문 내부, 지역 범위, 지역 변수
전역 변수는 어디에서나 참조할 수 있습니다.
로컬 변수는 자체 로컬 범위와 하위 로컬 범위에서만 유효합니다.
영역 사슬
함수 중첩: 함수 본문 내에 정의된 함수입니다.
중첩 함수: 함수 본문 내에 정의된 함수
외부 함수: 중첩 함수를 포함한 함수
범위는 또한 중첩 기능을 통해 계층 구조를 갖습니다.
중첩 함수의 상위 범위: 외부 함수의 범위
모든 범위는 계층 구조로 연결되어 있으며 모든 로컬 범위의 최상위 범위는 전역 범위입니다.
이 계층 구조 영역 사슬~라고 불리는
변수를 참조할 때 JavaScript 엔진은 범위 체인을 통과합니다. 변수를 참조하는 코드 범위에서 시작하여 상위 범위로 이동하면서 선언된 변수를 검색합니다.나무 상자.
1. 범위 체인에 대한 변수 검색
– 변수를 참조하는 코드의 범위부터 시작하여 상위 범위로 이동하면서 선언된 변수를 찾습니다.
– 상위 범위에서 유효한 변수는 하위 범위에서 자유롭게 참조할 수 있지만 하위 범위에서 유효한 변수는 상위 범위에서 참조할 수 없습니다.
2. 범위 체인에 의한 기능 검색
//전역 함수
function foo() {
console.log("global function");
}
function bar() {
//중첩함수
function foo() {
console.log("local function");
}
foo(); //local function
}
bar();
함수 선언문으로 함수를 정의하면 런타임 전에 먼저 함수 객체가 생성됩니다.
이 경우 식별자의 이름은 함수의 이름과 동일하지만 함수에도 할당된 식별자이므로 범위가 있습니다.
기능 수준의 범위
코드 블록이 아닌 함수에 의해서만 생성되는 로컬 범위
함수 본문뿐만 아니라 모든 코드 블록이 로컬 범위를 형성합니다. 블록 수준 범위 나무 상자
함수 수준 범위: var 키워드로 선언된 변수는 함수 코드 블록(함수 본문)의 로컬 범위만 인식합니다.
var x =1;
if (true) {{
var x= 10;
}
console.log(x); //10
이 예제에서 var x는 코드 블록 내부에서 선언되지만 전역 변수로 처리됩니다.
var 키워드로 선언된 변수는 함수 코드 블록만 로컬 범위로 보기 때문입니다.
어휘 수준의 범위
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); //1
bar(); // 1
범위를 결정하는 방법
동적 범위: 함수를 호출한 곳함수 acc의 상위 범위를 결정합니다.
정적 범위: 함수를 정의한 곳함수 acc의 상위 범위를 결정합니다.
정적 범위 === 어휘 범위
JavaScript는 어휘 범위를 따르므로 상위 범위는 함수가 정의된 위치에 따라 결정됩니다.
함수 정의가 실행될 때 함수의 부모 범위는 정적으로 결정됩니다. 함수 정의를 실행하여 생성된 함수 객체는 결정된 부모 영역을 기억합니다.