자바스크립트는 단순한 언어로 여겨져 왔다. 우리가 변수에 다른 타입을 넣어도 실행이 되기도 하고 변수의 범위가 다양하다는 인식이 있다. 그러나 코드를 작성하는 과정에서 전역과 지역 변수에 대한 이해가 없으면 추후 중복에 대한 오류로 인식하기가 어려운 경우가 존재한다. 그래서 우리는 자바스크립트를 사용할 때 변수가 어디서부터 어디까지 유효한지 그 유효한 범위를 잘 설정하여 사용할 필요가 있다. 그래서 스코프에 대한 이해가 먼저 필요하다.
식별자 접근 규칙에 따른 유효 범위
// test.js
var global_variable = "전역 변수";
function local() {
let local_variable = "지역 변수";
console.log(global_variable, local_variable);
}
local()
// console.log => "전역 변수""지역 변수"
console.log(global_variable, local_variable);
// ~~~~~~~~~~~~~~
// 지역 변수는 local() 함수 내에서만
// 오류가 발생을 하게 된다.
위 예시처럼 우리는 범위에 따른 변수의 사용 위치를 잘 이해하고 사용해야 한다.
{
let x = 2;
}
// x는 여기서 사용될 수 없다.
{
var x = 2;
}
// x는 여기서 사용될 수 있다.
// carName 사용 불가능
function myFunction() {
let carName = "Volvo";
// carName 사용 가능
}
// carName 사용 불가능
function myFunction() {
var carName = "Volvo"; // Function Scope
}
유효 범위, 값 재할당, 재선언
블록 단위로 스코프를 구분했을 때, 훨씬 더 예측 가능한 코드를 작성할 수 있으므로 let 키워드의 사용이 권장된다.
var carName = "Volvo";
// window.carName 의 형태로 사용할 수 있다.
let carName = "Volvo";
// window.carName 의 형태로 사용할 수 없다.
let store = {};
store.food = {
kind: "야식"
name: "야채 곱창"
};
// 다른 파일
console.log(store.food.kind);
(function() {
let store = {};
store.food = {
kind: "야식"
name: "야채 곱창"
};
console.log(store.food.kind);
})();
console.log(store.food.kind); // 이 함수는 인식하지 못하고 에러를 반환한다.
var a = "global";
function scope() {
var a = "local";
console.log(a);
}
scope(); // local
console.log(a) // global
전역 영역에서는 전역 변수만이 참조 가능하고 함수 내 지역 영역에서는 전역과 지역 변수 모두 참조 가능하지만 변수명이 중복된 경우 지역 변수를 우선하여 참조하게 된다.
var x = 'global';
function foo() {
var x = 'local';
console.log(x);
function bar() { // 내부함수
console.log(x); // local
}
bar();
}
foo(); // local, local
console.log(x); // global
내부 함수에서는 자신을 포함하고 있는 함수가 먼저 우선시 되어 local을 반환하게 된다.