var로 선언한 변수와 let 또는 const 로 선언한 변수의 스코프도 다르게 동작한다.
fnuction add(x, y) {
// 매개변수는 함수 몸체 내부에서만 참조 가능하다.
// 매개변수의 유효한 범위는 함수 몸체 내부.
console.log(x, y);
return x + y;
}
add(5, 10);
// 매개변수는 함수 몸체 내부에서만 참조할 수 있다.
console.log(x, y); // ReferenceError : x is not dedfuned
let Day1 = 1; // 코드 가장 바깥 영역에서 선언한 변수
if (true) {
let Day2 = 2; // 코드 블록 내에서 선언한 변수
if (true) {
let Day3 = 3; // 중첩된 코드 블록 내에서 선언한 변수
}
}
functoin One() {
let Day4 = 4; // 함수 내에서 선언한 변수
function Two() {
let Day5 = 5; // 중첩된 함수 내에서 선언한 변수
}
}
console.log(Day1); // 1
console.log(Day2); // 2
console.log(Day3); // 3
console.log(Day4); // ReferenceError: Day4 is not defined
console.log(Day5); // ReferenceError: Day5 is not defined
변수는 자신이 선언된 위치에 의해 자신이 유효한 범위, 즉 다른 코드가 변수 자신을 참조할 수 있는 범위가 결정된다.
모든 식별자( 변수 이름, 함수 이름, 클래스 이름 등 ) 는 자신이 선언된 위치에 의해
다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정된다.
스코프는 식별자 접근 규칙에 따른 유효 범위.
식별자에 접근할 수 있는 범위가 존재.
범위는 중괄호 또는 변수에 의해 나눠진다.
코드는 전역과 지역으로 구분할 수 있다.
구분
설명
스코프
변수
전역
코드의 가장 바깥 영역
전역 스코프
전역변수
지역
함수 몸체 내부
지역 스코프
지역 변수
let x = "day x"; // 전역 스코프
let y = "day y"; // 전역 스코프
function outer() { // 지역 스코프 #1
let z = "outer day z"; 지역 스코프 #1
console.log(x); // day x // 지역 스코프 #1
console.log(y); // day y // 지역 스코프 #1
console.log(z); // outer day z // 지역 스코프 #1
function inner() { // 지역 스코프 #2
let x = "inner day x"; // 지역 스코프 #2
console.log(x); // inner day x // 지역 스코프 #2
console.log(y); // day y // 지역 스코프 #2
console.log(z); // outer day z // 지역 스코프 #2
}
inner(); // 지역 스코프 #1
}
outer(); // 전역 스코프
console.log(x); // day x // 전역 스코프
console.log(z); // ReferenceError : z is not defined // 전역 스코프