스코프 (유효범위)

suyeon·2022년 2월 3일
0

만약 스코프라는 개념이 없다면, 같은 이름을 갖는 변수는 충돌을 일으키므로 프로그램 전체에서하나밖에 사용할 수 없다. var, let, const 키워드로 선언한 변수의 스코프는 각각 다르게 작동한다.

(1) 스코프의 종류
-전역 스코프
-지역 스코프 (함수 스코프, 블록 스코프) : 코드의 특정 부분에서만 사용 가능

(2) 함수 레벨 스코프
var 키워드로 선언된 변수가 오로지 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정하는 것이다.

var x = 1;
if (true) {
var x = 10; 
}
console.log(x); // 10
// var 키워드로 선언된 변수는 함수의 코드 블록만을 지역 스코프로 인정한다.
// 함수 밖에서 var 키워드로 선언된 변수는 코드 블록 내에서 다시 선언되었다고 하더라도 모두 전역 변수이다.
// if 문이 아니라 함수라면 이야기가 달라지겠지만, if문인 블록 레벨 안에서 var은 전역변수이다.
var i = 10;
for (var i=0; i<5; i++) {
	console.log(i); // 0 1 2 3 4
}
console.log(i); // 5
// 의도치 않게 변수의 값이 변경되는 문제를 확인할 수 있다.
var x = 1;
function foo() {
	var x = 10;
	bar(); // 1 
// 렉시컬 스코프: bar 함수가 호출되면, 호출된 곳이 어디인지 관계없이 언제나 자신이 기억하고 있는 전역 스코프를 상위 스코프로 사용한다. 
}
function bar() {
	console.log(x); // 1
}
foo();
bar();
function foo() {
	var x = ‘local’;
	console.log(x) // ‘local’
	return x;
}
foo();
console.log(x); // ReferneceError: x is not defined

(3) 블록 레벨 스코프
함수 몸체만이 아니라 모든 코드 블록 (if, while, for, try/catch 등)을 지역 스코프로 인정하는 것이다.

let foo = 1;
{
	let foo = 1;
	let bar = 3;
}
console.log(foo); // 1
console.log(bar); // ReferenceError: bar is not defined.

*참고
let은 선언 단계(var foo;)와 초기화 단계(foo=1;)가 나뉘어져 있다.

4. 전역 변수의 문제점
변수는 생성되고 소멸되는 생명주기가 있다. 변수에 생명 주기가 없다면 한번 선언된 변수는 프로그램을 종료하지 않는 한 영원히 메모리를 차지하게 된다. 전역 변수의 생명 주기는 어플리케이션의 생명 주기와 같다. 하지만 함수 내부에서 선언된 지역 변수는 함수가 호출되면 생성되고 함수가 종료하면 소멸한다.

문제점 1 : 전역 변수를 선언한 의도는 전역, 즉 코드 어디서든 참조하고 할당할 수 있는 변수를 사용하겠다는 것이다. 변수의 유효 범위가 크면 클수록 코드의 가독성은 나빠지고 의도치 않게 상태가 변경될 수 있는 위험성도 높아진다.

문제점 2 : 전역 변수는 생명 주기가 길기 때문에 메모리 리소스도 오랜 기간 소비한다.

결론 : 전역 변수를 반드시 사용해야 할 이유를 찾기 못한다면 지역 변수를 사용해야 한다. 변수의 스코프는 좁을수록 좋다.

0개의 댓글