변수와 상수(var, let, const)

봄봄·2021년 10월 4일
0

공부해봄

목록 보기
1/17

[변수와 상수]

변수 : 변하는 값 (재할당을 해도 되는 것 : var, let)

상수 : 변하지 않는 값 (재할당이 안 되는 것 : const)

[변수 생성의 3단계]

선언 → 초기화 → 할당
1. 선언 : 실행하는 context에 변수 객체를 등록한다. (스코프가 참조하는 대상이 되도록!)

💡스코프(Scope) 란? 
변수에 접근할 수 있는 범위를 말한다.
- 전역 스코프(Global Scope) : 전역에 선언되어있어 어느 곳에서든지 해당 변수에 접근할 수 있다는 의미
- 지역 스코프(Local Scope) : 해당 지역에서만 접근할 수 있어 지역을 벗어난 곳에선 접근할 수 없다는 의미
  1. 초기화 : 변수 객체에 등록된 변수를 위해 메모리에 공간을 확보한다. (여기서 변수는 보통 undefined로 초기화된다.)

  2. 할당 : undefined로 초기화된 변수에 실제 값을 할당

[var]

  • var로 선언한 변수는 블록 스코프가 아니라 함수 수준 스코프를 가진다.
  • var는 선언과 초기화를 한번에 한다.
  • 재선언이 가능하다.
var a = 1;
console.log(a);
// 1이 출력

var a = 2;
console.log(a);
// 2가 출력
  • 선언하기 전에도 사용할 수 있다.
// var는 선언을 아래에다 해도 동작한다.
// var name은 선언, name = "bom"은 할당
function person(){
	name = "bom";
	alert(name);
	var name;
}

person();

// var name은 함수의 최상위로 호이스팅이 되기 때문에 
// 실행될 일이 없는 구문 속에 있어도 선언이 된다.
// 자바스크립트가 동작하기 전에 코드를 한 번 훑는데(실행context) 
// 그 때 var로 선언된 코드를 전부 최상위로 끌어올린다.
  • 코드 블럭을 무시한다.

*** 따라서 var는 가급적 사용하지 않는 게 좋다.

[let]

  • 자바스크립트에서 변수를 생성할 때 쓰는 키워드
  • block-scope를 갖는다.
    • {}안에서 선언하면 {} 안에서만 쓰고 바깥에선 쓸 수 없다.
  • 재선언은 불가, 재할당은 가능!
    // 재할당은 가능!
    let name = 'bom';
    name = '봄이';
    
    // 재선언은 오류!
    let name = 'bom';
    let name = '봄이'; 

[const]

  • 자바스크립트에서 상수를 생성할 때 쓰는 키워드
  • block-scope를 갖는다.
    • {}안에서 선언하면 {} 안에서만 쓰고 바깥에선 쓸 수 없다.
  • 재선언 불가, 재할당도 불가! (⇒ 선언과 동시에 할당한다.)
    // 재할당 오류!
    const name = 'bom';
    name = '봄이';
    
    // 재선언도 오류!
    const name = 'bom';
    const name = '봄이';
    
    // 선언과 동시에 할당 되기 때문에 선언만 하고 값을 안줘도 오류가 난다.
    const name;

[TDZ(Temporal Dead Zone) = 일시적 사각지대]

TDZ(Temporal Dead Zone일시적인 사각지대)는 스코프의 시작 지점부터 초기화 시작 지점까지의 구간을 TDZ(Temporal Dead Zone) 라고 한다.

let과 const는 var와 달리 변수가 선언되기 전에 호출을 하면 ReferenceError 가 난다.

왜 에러가 날까? 호이스팅이 안 된 걸까?

정답은 호이스팅은 된다!

다만, 선언한 후, 초기화 단계에서 메모리에 공간을 확보하는데, 선언을 호이스팅해도 초기화 전까지 메모리에 공간이 확보되지 않아 변수를 참조할 수 없기 때문에 에러가 나는 것이다.
이것을 TDZ라고 한다.

→ 스코프에 진입할 때 변수를 만들고, TDZ가 생성되지만 코드 실행이(=실행 컨텍스트가) 변수가 있는 실제 위치에 도달할 때까지 엑세스를 못하기 때문이다.

[변수명]

변수명은 숫자로 시작할 수 없고, _와 $를 제외한 특수문자를 쓸 수 없다.

0개의 댓글