- 변수
: 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름(값의 위치를 가리킴)
- 변수 선언
: 변수를 생성, 값을 저장하기 위한 메모리 공간 확보, 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것
1) var
① 함수 레벨 스코프(전역변수의 개념)
-> 변수명을 전역에서 사용하기 때문에 충돌이 일어날 수 있고, 메모리 낭비가 있으므로 let이나 const 키워드를 사용하는게 좋다.
② 선언하기 전 사용가능(호이스팅)
console.log(a) //undefined
var a;
console.log(b) //undefined
var b = 10;
③ 같은 변수명으로 재선언 가능 (덮어쓰기 개념)
var a = 10;
var a = 'Hello';
console.log(a); // Hello
④ 저장된 값 수정 가능
var a = 10;
a = 'Hello';
console.log(a); // Hello
⑤ 선언 시 초기화를 생략 가능(undefined 상태)
=> 변수에 값을 할당하지 않아 메모리 공간이 비어있을 것 같아도 자바스크립트 엔진에 의해 undefined라는 값이 암묵적으로 할당되어 초기화 됨.
var a;
console.log(a) //undefined
* 자바스크립트 엔진 : 선언 단계 -> 초기화 단계(값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화)
2) let(ES6)
-> var 키워드의 단점을 보완하기 위해 ES6에 도입
① 블록레벨({}) 스코프 (지역변수의 개념)
let a = 1; //전역변수
{
let a = 2; //지역변수
let b = 2;
}
console.log(a) // 1 -> 전역에서는 지역변수 참조 불가
console.log(b) // ReferenceError : 지역변수로 전역에서 참조하므로 에러발생
② 선언하기 전에 사용하면 오류 발생
console.log(a); // ReferenceError
let a;
③ 같은 변수명으로 재선언 불가능
let c = 12;
let c = 123333; // 불가능
④ 저장된 값 수정 가능
let c = 12344;
c = 11111; // 가능
⑤ 선언 시 초기화를 생략 가능 , 초기화 이전까지는 존재하지 않는 상태(메모리에 없음)
* 할당 전에 undefined로 초기화가 되지만, 메모리에 값을 올리진 않기 때문에 ReferenceError 발생
console.log(foo); //ReferenceError //선언만 호이스팅(초기화는 x)
let foo; //선언과 초기화 실행
console.log(foo); // undefined
foo = 1; // foo에 1을 할당
console.log(foo); // 1
* 일시적 사각지대(TDZ) : 스코프의 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 없는 구간
3) const(ES6)
* const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화!
* 상수이므로 재할당 불가능
① 블록레벨({}) 스코프이다. (지역상수의 개념)
const a = 1;
{
const a=10;
}
cosole.log(a); //1 => 전역변수 a의 값
② 선언하기 전에 사용하면 오류가 발생한다.
console.log(d); //ReferenceError
const d = 1;
③ 같은 변수명으로 재선언이 불가능하다.
const h = 10;
const h = 'hello'; //ReferenceError
④ 저장된 값을 수정할 수 없다. (상수)
const j = 10;
j = 123; //ReferenceError
⑤ 선언 시 반드시 초기화를 해야 한다.
const f; // SyntaxError: Missing initializer in const declaration
'국비 > JavaScript' 카테고리의 다른 글
JavaScript _ 호이스팅 (0) | 2021.10.13 |
---|
댓글