const x = 1; // 전역 스코프
function outer() {
const x = 10; // outer 스코프
function inner() {
// x는 어디서 참조할까요
// 함수가 선언된 렉시컬 환경!!
// 함수가 선언될 당시의 외부 변수 등의 정보
console.log(x); // 10
}
innerc();
}
outer();
위 코드에서 outer 함수가 실행되면 x를 10으로 선언하고 inner 함수가 실행된다.
inner 함수는 먼저 내부에서 x 값을 찾는다 없을 경우 외부에서 x를 찾게 된다.
함수가 선언된 환경, 함수가 선언될 당시의 외부 변수 등의 정보를 렉시컬 환경이라고 이해하자. 이 경우 inner 함수의 렉시컬 환경은 outer.
const x = 1
function Func1 () {
const x = 10
Func2()
}
function Func2() {
console.log(x)
}
Func1()
위 코드를 살펴보자. Func2는 Func1 내부에서 호출됐지만
Func2는 x=10을 참조할 수 없다.
Func1와, Func2는 다른 스코프를 가지고 있다. --> 변수를 공유할 수 없다.
const x = 1;
function Func1() {
const x = 10;
Func2();
}
function Func2() {
console.log(x);
}
Func1(); // 1
Func2(); // 1
위 코드에서 Func1, Func2 모두 1을 참조하고 있다.
Func2 함수를 Func1 함수의 내부에서 호출한다 하더라도 Func1 함수의 변수에 접근할 수는 없다.
자바스크립트는 함수를 어디서 "호출했는지"가 아니라 어디에 "정의했는지"에 따라
상위 스코프를 결정한다. 외부 렉시컬 환경에 대한 참조에 저장할 참조값.
스코프에 대한 참조는 함수 정의가 평가되는 시점에 함수가 정의된 환경(위치)에 의해 결정된다.