프로그램에 사용되는 데이터를 일정 기간 동안 기억하여 필요한 때에 다시 사용하기 위해 데이터에 고유의 이름인 식별자를 명시한 것.
변수명 | 변수값 |
---|---|
변수에 명시한 고유한 식별자 | 변수로 참조할 수 있는 데이터 |
var foo = 123; // 전역 변수
console.log(foo); // 123
{
var foo = 456; // 전역 변수
}
console.log(foo); // 456
함수 레벨 스코프(Function-level scope)
함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다. 즉, 함수 내부에서 선언한 변수는 지역 변수이며 함수 외부에서 선언한 변수는 모두 전역 변수이다.
let
과 const
는 변수 재 선언이 불가능하다.
var
대신 사용되는 변수이다.let foo = 123; // 전역 변수
{
let foo = 456; // 지역 변수
let bar = 456; // 지역 변수
}
console.log(foo); // 123
console.log(bar); // ReferenceError: bar is not defined
코드 블록 내에 선언된 변수 foo는 전역에서 선언된 변수 foo와는 다른 별개의 변수이다.따라서 전역에서는 변수 bar를 참조 할수 없다.
블록 레벨 스코프(Block-level scope)
: 모든 코드 블록(함수, if,for,while, try/catch등) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조 할수 없다. 즉, 코드 블록 내부에서 선언한 변수는 지역 변수 이다.
const name = "gayoung";
name = "nayoung"; -> error
하지만 완벽하게 변수를 보호 할수 있는 것은 아니다
object일 경우에는 변경 가능하다.
const person = { name: "gayoung", } person.name="hayoung"
block scope_버블 {}
변수들이 접근이 가능한지 아닌지
var
대신 let
을 써야 하는가?var
console.log(myName);
var myName = "ga young"
undefined
결과가 나온다.let
console.log(myName);
let myName = "ga young";
hoisting
JS 가 프로그램을 실행하기 전에 어딘가로 이동을 시킨다.
(뭐든지 간에 제일 위로 올려준다.)
let
을 사용한다면 정의하기 전에 부를때 무조건 에러를 출력해 준다.
var
if(true) {
var hello = "hi"
}
console.log(hello);
// hi
var
는 block scope를 가지지 않고 function scope 를 가져서 결과를 보여준다.let
if(true) {
let hello = "hi"
}
console.log(hello);
// 에러를 도출해준다.
대신 한번 호출을 한 후에는 사용 할수 있다.
let hello; if(true){ hello = "lallala" } console.log(hello) // lallala