모던 자바스크립트 Deep Dive - 15장 let, const 키워드와 블록 레벨 스코프

밀루·2023년 10월 19일
0

var 키워드로 선언한 변수의 문제점

변수 중복 선언 허용

  • 의도치 않게 먼저 선언된 변수 값이 변경되는 부작용이 발생할 수 있음
var x = 1;
var y = 1;

// 중복 선언 허용 (var 키워드가 없는 것처럼 동작)
var x = 100;

// 초기화문이 없는 변수 선언문은 무시
var y;        

console.log(x); // 100
console.log(y); // 1

함수 레벨 스코프

  • 함수 외부에서 var 키워드로 선언함 변수는 코드 블록 내에서 선언해도 전역변수가 됨
    => 함수 레벨 스코프는 전역 변수를 남발할 가능성을 높임
var i = 10;

// for문에서 선언함 i는 전역변수 + 이미 i가 있어서 중복 선언됨..
for (var i=0; i<5; i++) {
	console.log(i); // 0 1 2 3 4
}

console.log(i); // 5 => 의도치 않게 i 값이 변경됨

변수 호이스팅

var 키워드로 선언한 변수는 변수 호이스팅에 의해 변수 선언문 이전에 참조할 수 있음 (할당 이전에 변수를 참조하면 undefined를 반환)


var 키워드의 단점을 보완하기 위해 ES6에서 새로운 변수 키워드인 let, const를 도입했다~


let 키워드

변수 중복 선언 금지

  • let 키워드로 변수 중복 선언하면 문법 에러가 발생
let bar = 123;
let bar = 456; // SyntaxError..!

블록 레벨 스코프

모든 코드 블록(함수, if문, for문, try/catch문 등)을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.

변수 호이스팅

  • let 키워드로 선언한 변수는 변수 호이스팅이 발생하지 않는 것처럼 동작
    => 변수 선언 이전에 참조하면 참조에러(ReferenceError) 발생

  • let 키워드로 선언한 변수는 선언 단계초기화 단계가 분리되어 진행됨
    => var 키워드 처럼 호이스팅 되어 undefined를 할당해주지 않음

    이때 변수 스코프의 시작 지점부터 초기화 단계 시작 지점 까지 변수를 참조할 수 없는 구간을 일시적 사각지대라고 부른다.

전역 객체와 let

var 키워드로 선언한 전역 변수나 함수는 전역 객체의 프로퍼티가 되지만,

let 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니다.


const 키워드

  • 상수 선언

선언과 초기화

  • const 키워드로 선언한 변수는 선언과 동시에 초기화 해야함

재할당 금지

상수니깐..

상수

  • const로 선언된 변수에 원시 값을 할당한 경우 원시 값은 변경할 수 없는 값이고 const 키워드에 의해 재할당이 금지되므로 할당된 값을 변경할 수 있는 방법은 없음

const 키워드와 객체

const 키워드로 선언된 변수의 원시 값은 변경할 수 없지만, 객체를 할당한 경우 값을 변경할 수 있다

const person = {
	name: 'lee'
}

person.name = 'milou';

console.log(person); // {name: 'milou'}

const 키워드는 재할당을 금지할 뿐 "불변"을 의미하지는 않는다


var vs. let vs. const

  • ES6을 사용한다면 var 키워드는 사용하지 않는다
  • 재할당이 필요한 경우에 한정해 let 키워드를 사용한다 (변수의 스코프는 최대한 좁게 만든다)
  • 변경이 발생하지 않고 읽기 전용으로 사용하는 원시 값과 객체에는 const 키워드를 사용한다. (const 키워드는 재할당을 금지하므로 var, let 키워드보다 안전하다)
profile
이밀루의 도전

0개의 댓글