2022. 8. 5. 15:53ㆍProgram/JavaScript
252_자바스크립트 함수 내부 변수와 상수의 범위알기
[적용]
- 처리를 단위로 분할하고 싶을 때
- 변수, 상수의 유효 범위를 좁히고 싶을 때
[문법]
구문 | 의미 |
{} | 블록 스코프 |
[내용]
let과 const로 선언된 변수와 상수는 {}로 감싸진 범위의 블록 내에서만 사용할 수 있다.
변수와 상수가 유효한 범위를 스코프(Scope)라고 하며, {}로 감싸진 유효 범위를 블록 스코프(Block Scope)라고 한다.
다음의 상수 a는 블록 스코프 내에서 사용되고 있으므로 모든 console.log()에 20이라는 결과가 출력된다.
블록 외부에서 선언한 변수와 상수도 내부에서 사용할 수 있다.
JavaScript
{
const a = 20;
// 20 출력
console.log(a);
{
// 20 출력
console.log(a);
}
}
실행결과
블록의 외부에서 상수 a를 사용하면 에러가 발생한다.
이유는 블록 내부에서 선언된 상수는 외부에서 엑세스가 불가능하기 떄문이다.
JavaScript
{
{
const a = 20;
}
// 스코프를 벗어나므로 에러가 발생
console.log(a);
}
실행결과
모든 스코프의 가장 상위는 전역 스코프가 된다.
전역 스코프에서 선언한 상수와 변수는 모든 블록에서 사용할 수 있다.
JavaScript
const a = 20;
{
console.log(a); // 결과: 20
}
블록은 함수, if문, for문 등 여러 곳에서 사용된다.
다음 샘플을 통해 함수의 경우를 확인해 보자.
myValue는 myFunction 함수 내에서만 유효하다.
JavaScript
function myFunction() {
const myValue = '사자';
console.log(myValue);
function myChildFunction() {
console.log(myValue); // 결과: '사자'
}
myChildFunction(); // 결과: '사자'
}
myFunction(); // 결과: '사자'
// 스코프를 벗어나므로 에러가 발생
console.log(myValue);
if문의 경우도 확인해 보자.
if문의 외부에서는 상수 myValue2의 참조가 불가능하므로 에러가 발생한다.
JavaScript
if (true) {
// myValue2 정의
const myValue2 = '사자';
}
// myValue2는 스코프를 벗어나므로 에러
console.log(myValue2);
[Appendix]
블록 스코프 범위를 벗어나는 var 선언
변수는 let이 아닌 var를 사용해서도 선언할 수 있다.
var는 예전부터 사용된 변수 선언 방법이지만, 블록 스코프를 사용한 범위의 한정은 불가하다.
다음의 코드를 통해 블록 스코프를 벗어난 변수 접근을 확인해 보자.
JavaScript
{
var myValue = 20;
}
console.log(myValue); // 결과: 20 (에러가 발생하지 않음)
if (true) {
if (true) {
var myValue2 = '사자';
}
}
console.log(myValue2): // 결과: '사자' (에러가 발생하지 않음)
이와 같은 코드는 상수와 변수의 스코프 범위 파악이 어렵고 버그의 원인이 되기도 한다.
그러므로 기본적으로 블록 스코프 범위가 한정되는 const와 let을 사용하는 것이 안전하다.
참조 :
실무에 바로 적용하는 자바스크립트 코드레시피 278
아케다 야스노부, 카노 타케시 지음 / 이춘혁 옮김
'Program > JavaScript' 카테고리의 다른 글
[JavaScript] 자바스크립트에서 클래스 사용하기(인스턴스화) (0) | 2022.08.05 |
---|---|
[JavaScript] 자바스크립트에서 클래스 정의하기 (0) | 2022.08.05 |
[JavaScript] 자바스크립트에서 에러 종류 파악하기 (0) | 2022.08.05 |
[JavaScript] 자바스크립트에서 에러 발생시 실행코드 설정하기 (0) | 2022.08.05 |
[JavaScript] 자바스크립트에서 에러 발생 확인하기 (0) | 2022.08.05 |