희락코딩

JavaScript _개념정리/ 스코프(scope)개념 이해하기! 본문

프로그래밍/자바스크립트 개념 정리

JavaScript _개념정리/ 스코프(scope)개념 이해하기!

Hello JoyCoding 2021. 4. 24. 01:20
728x90
반응형

스코프


# 스코프 기본 개념

1. 스코프란 ?

scope는 쉽게 정의 하자면 변수가 영향을 미치는 유효 범위입니다.

이 스코프는 전역 스코프와 지역스코프로 나뉠 수 있습니다. 

 

우리는 이미 스코프를 경험하고 있습니다. 바로 함수입니다. 함수의 매개변수는 함수 몸체 내부에서만 참조 할 수 있고 몸체 외부에서는 참조할 수 없습니다. 이것은 매개변수를 참조할 수 있는 유효범위, 즉 매개변수의 스코프가 함수 몸체 내부로 한정 되어 있기 때문입니다.

 

1
2
3
4
5
6
7
8
9
10
function addNum(x, y)
// 매개변수는 함수 몸체 내부에서만 참조
// 즉 스코프(유효범위)는 함수 몸체 내부
console.log(x,y) // 3 7
return x + y;
}
 
addNum(3,7)
 
console.log(x,y) // ReferenceError : x is not defined
cs

 

위 예시를 보았듯이 매개변수는 함수 내부에서만 참조 할 수 있습니다. 이것이 스코프의 아주 기본적인 개념입니다.

 


2. 전역스코프(global)와 지역스코프(local)

변수는 코드의 가장 바깥 영역뿐 아니라 코드 블록이나 함수 몸체 내에서 선언이 가능하며 코드 블록이나 함수는 중첩이 될 수 있습니다.

 

이때 변수는 자신이 선언된 위치에 의해 자신이 유효한 범위인 스코프가 결정됩니다.

전역  코드의 가장 바깥 영역 전역 스코프 전역 변수
지역  함수 몸체 내부 지역 스코프 지역 변수

 

1
2
3
4
5
6
7
8
9
10
let x = 'global'
 
function joyfn() {
  let x = 'local';
  console.log(x);  // local
}
 
joyfn();
 
console.log(x); // global
cs

 

코드 가장 바깥 영역에 선언되 x 변수는 어디서든 참조 가능합니다. 하지만 joyfn 내부 함수에서 선언된 x변수는 joyfn 내부에서만 참조 할 수 있고 외부에서는 참조 할 수 없습니다

 

쉽게 말해 이름이 동일한 식별자(변수)이지만 스코프가 다른 별개의 변수입니다.

 


3. 함수 레벨 스코프 (var 키워드를 안쓰는 이유)

var 키워드로 선언한 변수는 오로지 함수의 코드 블록만을 지역 스코프로 인정합니다. 따라서 함수 외부에서 var 키워드로 선언한 변수는 코드 블록 내에 선언해도 모두 전역 변수가 되어 버립니다.

 

1
2
3
4
5
6
7
8
9
10
11
var x = 5;
 
if(true) {
   
// x는 전역 변수입니다 이미 선언된 변수 x가 있어 x변수는 중복 선언이 됩니다.
// 그래서 의도치 않게 변수값이 변경되는 부작용이 생깁니다.
 
  var x = 15
}
 
console.log(x); // 15
cs

 

위와 같이 함수 내에서 지역 스코프를 유지하지만 if와 for문 같은 블록문에서는 지역 스코프를 무시 해버립니다. 그래서 이러한 문제를 해결 하기 위해 Es6버전에서 변수 키워드인 let 과 const 키워드를 쓰게 되었고 이둘은 블록 레벨 스코프와 함수레벨 스코프를 사용 할 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
let x = 5;
 
if(true) {
   
// let 키워드는 블록레벨과 함수레벨 스코를 사용 할 수 있습니다.
// 그래서 콘솔창 결과가 전역변수인 x = 5를 출력하게 됩니다.
 
  let x = 15
}
 
console.log(x); // 5
cs

 

첫 번째 예시와 두번째 예시를 보면 왜 var 키워드를 안쓰는지 이해가 될 것입니다.


 

4. 블록 레벨 스코프 

위의 2번째 예시랑 같은 맥락입니다. 좀 더 직관적으로 설명하자면 말 그대로 {} 안에서 유효한 스코프입니다. (함수, if문, for문, while문, try/catch문 등등)

 

1
2
3
4
5
6
7
8
9
10
11
let joyCoding = 'global'
 
{
 let joyCoding = "local"
 let happyCoding = 77
 
 console.log(joyCoding);  // local
}
 
console.log(joyCoding);   // global
console.log(happyCoding); //ReferenceError: happyCoding is not defined
cs

 

let 키워드 변수는 블록 레벨 스코프를 따릅니다. 따라서 블록내에 선언된 joyCoding과 happyCoding (4,5번줄) 은 지역 변수입니다. 그래서 전역에 선언된 joyCoding과 블록내에 선언된 joyCoding은 이름은 같지만 별개의 변수입니다. happyCoding 변수도 마찬가집니다 그래서 블록내에 있는 변수는 전역 변수를 참조 할 수 없습니다.

728x90
반응형
Comments