어디서든 참조 가능
함수, 블록({})내에서만 참조 가능,
함수, 블록 내부에서 선언한 변수는 지역 변수, 외부는 전역 변수
var global = 'global';
function foo() {
var local = 'local';
console.log(global);
console.log(local);
}
foo();
console.log(global);
console.log(local); // ReferenceError: local is not defined
변수는 선언 위치(전역 또는 지역)에 의해 스코프를 가지게 된다.
즉, 전역에서 선언된 변수는 전역 스코프를 갖는 전역 변수이고,
지역에서 선언된 변수는 지역 스코프를 갖는 지역 변수가 된다.
ES5까지 변수를 선언할 수 있는 유일한 방법은 var 키워드를 사용하는 것이었다.
근데 var의 특징들이 있는데
function wow(){
var foo = 1; // 지역 변수
}
console.log(foo); // ReferenceError: foo is not defined
for(var i = 0; i < 3; i++){
}
console.log(i); // 전역 변수, 3
var foo = 123; // 전역 변수
console.log(foo); // 123
{
var foo = 456; // 전역 변수
}
foo = "이게 뭐람"; // 전역 변수
console.log(foo); // "이게 뭐람"
ES6는 이러한 var 키워드의 단점을 보완하기 위해 let과 const 키워드를 도입
let이랑 const는 블록 레벨 스코프를 따른다.
모든 코드 블록(함수, if 문, for 문, while 문, try/catch 문 등) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다.
let foo = 123; // 전역 변수
{
let foo = 456; // 지역 변수
let bar = 456; // 지역 변수
}
console.log(foo); // 123
console.log(bar); // ReferenceError: bar is not defined