자바스크립트 셀프 QnA(4): 선언 키워드 전쟁

9rganizedChaos·2021년 10월 25일
0
post-thumbnail

(<자바스크립트 셀프 QnA> 시리즈에 작성된 포스팅들은 각 주제에 해당하는 <모던 자바스크립트 딥다이브> 챕터를 읽으며 요약한 내용입니다. 더 자세한 내용은 <모던 자바스크립트 딥다이브>를 참고해주세요.)

모던 자바스크립트 딥다이브

Q1 var 키워드의 문제점

  • 중복 선언이 가능하다. (에러도 발생하지 않는다.)
  • 함수 스코프를 따른다. 떄문에 조건문, 반복문 등의 코드 블록들이 무시된다.
  • 그 결과 전역 변수를 남발할 가능성을 높이고, 의도치 않게 전역 변수가 중복 선언되는 경우가 발생한다.
  • 변수 호이스팅에 의해 변수 선언문이 스코프의 선두로 끌어올려진 것처럼 동작한다.
console.log(foo) // undefined

foo = 123;

console.log(foo) // 123

var foo;
  • 사실 변수 선언문 이전에 변수를 참조하는 것은 변수 호이스팅에 의해 에러를 발생시키지는 않지만, 가독성을 떨어뜨리고 오류를 발생시킬 여지를 남긴다.

Q2 let과 var의 차이점

  • let 키워드로 이름이 같은 변수를 중복 선언하면 문법 에러가 발생한다.
  • let 키워드로 선언한 변수는 모든 코드블록을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.

  • var 키워드로 선언한 변수와 달리 let 키워드로 선언한 변수는 변수 호이스팅이 발생하지 않는 것처럼 동작한다. 하지만 그렇지 않다!
let foo = 1;
{
  console.log(foo); // 레퍼런스 에러 발생함! 호이스팅 되고 있다는 것임!
  let foo = 2;
}
  • 하지만 var 키워드가 런타임 이전에 선언단계와 초기화 단계가 한 번에 진행되는 반면, let 키워드로 선언된 변수는 선언 단계와 초기화 단계가 별도로 일어난다. 때문에 호이스팅 되어 선언은 되었지만, 초기화는 변수 선언문에 도달했을 때 실행되는 것이다.
  • var 선언문: 선언단계 + 초기단계 > 할당단계
  • let 선언문: 선언단계 > 초기화단계 > 할당단계 (초기화 단계 전까지는 reference에러 발생시킴)
  • 자바스크립트는 ES6에서 도입된 let, const를 포함해서 모든 선언을 호이스팅한다. 단, ES6에서 도입된 let, const, class를 사용한 선언문은 호이스팅이 발생하지 않는 것처럼 동작한다.

  • let 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니다. (var의 경우 맞음) let 전역 변수는 보이지 않는 개념적인 블록 안에 존재하게 된다.

Q3 const와 let의 차이점

  • const로 선언한 변수는 반드시 선언과 동시에 초기화해야 한다.
  • 재할당이 금지된다.
  • 일반적으로 상수의 이름은 대문자로 선언해 상수임을 명확히 나타낸다. 여러 단어로 이루어진 경우에는 언더스코어로 구분해서 스네이크 케이스로 표현하는 것이 일반적이다.
  • const 키워드로 선언된 변수에 객체를 할당한 경우 값을 변경할 수 있다. const 키워드는 재할당을 금지할 뿐 "불변"을 의미하지는 않는다. (변수에 할당된 참조값은 변경되지 않는다.)

총정리

  • ES6 사용한다면 var 쓰지마렴
  • 일단 const를 쓰고, 재할당 필요하면 let으로 전환
  • let 사용할 때는 변수의 스코프를 가능한 좁게 만들어라
profile
부정확한 정보나 잘못된 정보는 댓글로 알려주시면 빠르게 수정토록 하겠습니다, 감사합니다!

0개의 댓글