2023/12/16(토)
변수의 유효 범위, 스코프에 관하여
앞서 클로저를 이해하기 위해서는 변수의 유효 범위에 따라서 어휘적 환경이 결정된다고 언급했다. 이러한 변수의 유효 범위를
스코프(scope)라고 하는데,자바스크립트에는 다양한 스코프가 존재한다.
전역 레벨에 선언하는 것을 전역 스코프(global scope)라고 한다.
전역(global) 이라는 이름에서 유추할 수 있듯이, 이 스코프에서 변수를 선언하면 어디서든 호출할 수 있게 된다.
브라우저 환경에서 전역 객체는 window,
Node.js 환경에서는 global이 있는데, 바로 이 객체에 전역 레벨에서 선언한 스코프가 두 환경을 묶어 일치 시킨다. 즉, 바인딩된다.
<script>
var global = 'global scope'
function hello() {
console.log(global)
}
console.log(global) // global scope
hello()// global scope
console.log(global === window.global)//true
</script>
위 코드는 global이라는 변수를 var와 함께 선언했더니 전역 스코프와 hello 스코프 모두에서 global 변수에 접근할 수 있는것을 확인 할 수있다.
다른 언어와 달리 자바스크립트는 기본적으로 함수 레벨 스코프를 따른다.
즉, {} 블록이 스코프 범위를 결정하지 않는다. 아래 예제코드를 살펴보자.
<script>
if (true){
var global = 'global scope'
}
console.log(global) 'global scope'
console.log(global === window.global)// true
</script>
var global은 분명 {}내부에서 선언돼 있는데,{}밖에서도 접근이 가능한 것을 확인할 수 있다.이는 앞서 이야기한 것처럼 기본적으로 자바스크립트는 함수 레벨 스코프를 가지고 있기 때문이다.
<script>
function hello() {
var local = 'local variable'
console.log(local)// local variable
}
hello()
console.log(local) // Uncaught ReferenceError : local is not defined
</script>
단순한 if 블록과는 다르게 함수 블록 내부에서는 일반적으로 예측하는 것과 같이 스코프가 결정되는 것을 볼 수 있다.
만약 스코프가 중첩돼 있다면 어떻게 될까?
<script>
var x = 10;
function foo(){
var x = 100;
console.log(x)//100
function bar(){
var x = 1000;
console.log(x)//1000
}
bar()
}
console.log(x)//10
foo()
</script>
자바스크립트에서 스코프는,일단 가장 가까운 스코프에서 변수가 존재하는지를 먼저 확인해 보는데, 이러한 사실을 알고 있다면 위 예제에서 x가 어디에 선언돼 있는지에 따라 값이 달라질 수 있음을 쉽게 확인할 수 있을 것이다.
➡️ 다음 글에서는 클로저는 어떻게 활용 하는지 살펴보자.