프로그래밍 언어에서
Scope
는 변수(Variable)의 유효 범위를 뜻한다.
이 글에서 스코프에 대해서 Araboza.
전역 스코프는 어떠한 영역안에 선언되는 것이 아닌 함수 및 블록 외부에 선언되어 어디서든 접근할 수 있다.
전역 범위로 선언된 변수를 전역 변수(Global variable)
라고 한다.
const num = 1;
console.log(num); //2
또한 아래와 같이 어떤 함수 내부와 같은 영역에서도 접근이 가능하며 이에 속한 변수들은 웹페이지가 닫혀야 메모리에서 제거된다.
// 전역 변수는 함수/블록 스코프 내에서도 접근이 가능하다.
function func() {
return num + 1;
}
console.log(func()) // 2
지역 스코프는 전역 스코프와 달리 중괄호{}
로 쌓여진 정해진 영역안 에서만 접근이 가능하다.
지역 범위로 선언된 변수를 지역 변수(Local Variable)
라고 한다.
function func() {
const num = 3
return 0;
}
// 함수밖에선 접근하지 못한다.
console.log(num) // ReferenceError: num is not defined
if (!name){
const str = 'Hi'
}
// 마찬가지로 블록 밖에선 블록 내 지역함수에 접근하지 못한다.
console.log(str) // ReferenceError: str is not defined
스코프는 함수가 호출될 때가 아닌 선언할 때 생긴다!
무슨 말이냐면...
let name = 'kil';
function one() {
console.log(name);
}
function two() {
name = 'kim';
log();
}
two();
위 코드의 출력값은 kim
이다.
let name = 'kil';
function one() {
console.log(name);
}
function two() {
let name = 'kim';
one();
}
two();
위 코드의 전과 달리 one
안의 name
은 전역변수 name
을 가르키기 때문에 출력값은 kil
이다.
이제 이해가 된다!
블록 내에서 특정 변수를 찾지 못하면 윗 블록에서 해당 변수를 찾고, 이를 반복하여 전역 스코프까지 반복한다.
이 과정을 Scope chain
이라고 한다.
전역 변수는 어떠한 영역에서도 접근이 가능하다는 점 덕분에 '잘만 이용하면 편하게 코딩을 할 수 있지 않나'라는 생각을 할 법하다.
하지만 과도한 전역 변수의 사용은 아래와 같이 스코프 간의 혼선을 야기하게 된다.
let v = 1;
const func = () => {
v = 10;
}
func();
console.log(v); // v = 30
함수내에서 따로 변수의 선언을 하지 않게되면 전역 변수 v
의 값이 바뀌게 되고 고정된 v
값을 원하는 다른 함수들에 영향을 미칠 수가 있다.
ps. 당연하게도 변수 뿐만 아니라 함수 또한 스코프에 영향을 받는다.