블록 스코프란 무엇인가?
자바스크립트는 let 또는 const 키워드로 선언된 변수에 대해서만 블록 스코프(block scope)를 지원합니다. 반면 var 키워드로 선언된 변수는 함수 스코프(function scope)만 지원하며, 중괄호 { } 로 묶인 블록 단위의 스코프는 적용되지 않습니다.
쉽게 말해, 블록 안에서 let으로 선언한 변수는 해당 블록을 벗어나면 접근할 수 없지만, var로 선언한 변수는 블록 외부에서도 그대로 접근이 가능합니다. 블록 스코프는 ES6(ECMAScript 2015)에서 let과 const가 도입되면서 본격적으로 지원되기 시작했습니다.
예제 코드
다음은 자바스크립트에서 블록 스코프의 동작을 확인할 수 있는 예제입니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
body {
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
}
.result {
font-size: 20px;
font-weight: 500;
color: blueviolet;
}
</style>
</head>
<body>
<h1>Block scope JavaScript</h1>
<div class="result"></div>
<br />
<button class="Btn">Click Here</button>
<h3>Click on the above button to create variables with var and let keyword and access them</h3>
<script>
let resEle = document.querySelector(".result");
let BtnEle = document.querySelector(".Btn");
{
let a = 22;
}
{
var b = 44;
}
BtnEle.addEventListener("click", () => {
try {
resEle.innerHTML = a;
} catch (err) {
resEle.innerHTML = err + "<br>";
}
resEle.innerHTML += "var b = " + b;
});
</script>
</body>
</html>
실행 결과
페이지를 실행하면 아래와 같은 화면이 나타납니다.

'Click Here' 버튼을 클릭하면 다음과 같은 결과가 출력됩니다.

결과 분석
버튼을 클릭하면 두 가지 결과를 확인할 수 있습니다.
첫째, 블록 안에서 let으로 선언한 변수 a에 접근하려고 하면 ReferenceError가 발생합니다. 이는 변수 a가 선언된 블록 { } 내부에서만 유효하기 때문입니다. 즉, 블록 스코프가 정상적으로 동작하고 있는 것입니다.
둘째, var로 선언한 변수 b는 블록 외부에서도 오류 없이 값 44에 접근할 수 있습니다. var는 함수 스코프만 인식하기 때문에 블록을 벗어나도 변수가 유지되는 것입니다.
이처럼 자바스크립트에서 변수 스코프 관련 오류를 방지하려면, 블록 단위로 유효한 let과 const 사용을 권장합니다.