
JavaScript에서의 스코프는 "변수의 유효범위"로 사용
let username = 'kimcoding';
if (username) {
let message = `Hello, ${username}!`;
console.log(message); // "Hello, kimcoding!"
}
console.log(message); // ReferenceError
1번째 console.log(message)에서는 username을 바깥 스코프에서 가져왔으므로 정상적으로 출력.
그러나, 2번째 console.log(message)에서는 변수 자체가 안쪽 스코프에 선언되어있으므로, 바깥쪽에서는 접근이 불가.

✅ 안쪽 스코프에서 바깥쪽 스코프로는 접근할 수 있지만 반대는 불가능.전역스코프 (Global Scope), 지역스코프(local scope)
✅ 지역 변수는 전역 변수보다 더 높은 우선순위를 가짐
let name = '김코딩';
function showName() {
let name = '박해커'; // 지역 변수
console.log(name);
}
console.log(name); // '김코딩'
showName(); // '박해커'
console.log(name); // '김코딩'
1, 3번째 name 에서는 전역변수에 선언된 name을 가져옴.
반면, 2번째 name에서는 함수 안에서 선언된 지역 변수 name 에 접근 하고 있기 때문에, 변수 이름이 전역 변수와 똑같지만, 지역 변수가 전역 변수보다 우선순위가 높으므로, 지역 변수 name이 출력.
쉐도잉 (variable shadowing) : 동일한 변수 이름으로 인해 바깥쪽 변수가 안쪽 변수에 의해 가려지는(shadow) 이러한 현상let name = '김코딩';
function showName() {
name = '박해커';
console.log(name);
}
console.log(name); // 첫 번째 출력 '김코딩'
showName(); // 두 번째 출력 '박해커'
console.log(name); // 세 번째 출력 '박해커'
앞에 문제와는 다르게 함수 내에서 let 키워드를 사용한 선언이 존재하지 않음
이는 '박해커'라는 값으로 할당하고 있는 name 변수는 전역에 선언된 name 변수를 그대로 사용하겠다는 의미
따라서 showName 함수가 실행되기 전까지는 '김코딩'을 출력하고,
이후, 전역변수 name의 값이 바뀌기 때문에 '박해커'가 출력
블록 스코프 (block scope), 함수 스코프(function scope)
블록 스코프 (block scope)화살표 함수를 사용하면 블록 스코프로 취급.
함수 스코프(function scope)
let, const를 주로 사용var 키워드는 블록 스코프를 무시하며, 재선언을 에러를 내지 않음.var로 선언하는 경우 문제가 될 수 있음var로 선언한 변수가 window 기능을 덮어 씌워서 내장 기능을 사용할 수 없게 만들 수 있다.var, let, const) 없이 변수를 할당하지 말자.