군침이 싹 도는 코딩

변수, 호이스팅, TDZ(Temporal Dead Zone) 본문

JavaScript/Basic

변수, 호이스팅, TDZ(Temporal Dead Zone)

mugoori 2023. 6. 26. 14:56

var 과 let, const 의 차이점

var name = 'Mike' ;
console.log(name); // Mike

var name = 'Jane' ;
console.log(name); // Jane

---------------------------

let name = 'Mike' ;
console.log(name); // Mike

let name = 'Jane' ;
console.log(name); // error

---------------------------

let name = 'Mike' ;
console.log(name); // Mike

name = 'Jane' ;
console.log(name); // Jane

# var 과 let은 대부분의 경우에서 바꿔 사용할 수 있지만 차이점이 있다

var 은 변수를 바꿀때 또 선언해도 문제가 없지만

let은 변수를 바꿀 경우 또 선언하면 안된다

 

호이스팅 ( hoisting )

var name;

console.log(name); // undefined

name = 'Mike';

# var 는 선언하기 전에 사용할 수 있다

이를 호이스팅 (hoisting) 이라고 하는데 인터프리터가

변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 말한다

 

 

console.log(name); // ReferenceError

let name = 'Mike';

# let 과 const 경우에는 선언하기 전에는 사용할 수 없는데 이는 TDZ(Temporal Dead Zone) 때문이다

TDZ란 일시적인 사각지대로, 변수를 사용하는 것을 비허용하는 개념상의 공간이다.

TDZ에 있는 값에 접근하게 되면 ReferenceError: Cannot access 'xxx' before initialization 에러가 발생한다

 

 

변수의 생성 과정

1. 선언 단계

2. 초기화 단계

3. 할당 단계

 

var 

1. 선언 및 초기화 단계     

2. 할당 단계

 

let   

1. 선언 단계

2. 초기화 단계

3. 할당 단

 

const 

1. 선언 + 초기화 + 할당

 

let name;
name = 'Mike';

var age;
age = 30;

const gender; // SyntaxError
gender = 'male';

# let 과 var 은 문제가 없지만 const 는 선언과 동시에 할당을 해주어야 하기 때문에 에러가 난다

 

스코프

스코프란 변수에 접근할 수 있는 범위라고 생각하면 된다

 

var : 함수 스코프 (function-scoped)

let, const : 블록 스코프 (block-scoped)

 

함수 스코프 

  • 함수가 선언되면 하나의 스코프(접근 범위)가 발생하는데 이걸 함수스코프라고 한다.
  • 함수 스코프는 함수에서 선언한 변수는 해당 함수 내에서만 접근 가능하다는 걸 의미한다.
  • 아래 예시처럼 함수 외부에서 aa를 호출하면 undefined 에러가 뜬다.
function abc() {
  var aa = '12';  // 함수 내부에서 선언
}
console.log(aa);  // Uncaught ReferenceError: aa is not defined
if (true) {
  var abc = '123'; // var로 선언하면 블록에 의한 범위 제한이 없음
}
console.log(abc)  // 123

 

 

블록 스코프

  • 블록 스코프는 블록({})내부에서 선언된 변수는 해당 블록에서만 접근 가능한 걸 말한다.
  • let, const로 선언된 변수가 블록 스코프 방식을 따른다.
function hello() {
  for (var i=0; i<12; i++) {
    ...
  }
  console.log(i)   //접근가능
}

hello();  //12
function hello() {
  for (let i=0; i<12; i++) {
    ...
  }
  console.log(i)
}
hello();  // ReferenceError: i is not defined

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

##

 

 

 

 

 

 

 

 

'

 

 

.

'JavaScript > Basic' 카테고리의 다른 글

객체 메소드 ( Object methods )  (0) 2023.06.26
계산된 프로퍼티 ( Computed property )  (0) 2023.06.26
연산자 ( 증가 연산자 , 감소 연산자 )  (0) 2023.06.26
형변환  (0) 2023.06.26
대화 상자 ( alert, prompt, confirm )  (0) 2023.06.26