var, let, const

김영진·2022년 7월 20일
0

TIL

목록 보기
12/29
post-thumbnail
post-custom-banner

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

  • 변수 중복 선언 허용
var x = 1;

var x = 100;

console.log(x); //100

위의 예제 처럼 동일한 이름의 변수가 이미 선언되어 있는 것을 모르고 변수를 중복 설정하고 값까지 할당했다면 먼저 선언된 변수의 값이 의도치 않게 변경된다.

  • 함수 레벨 스코프
var x = 1;

if (true) { var x = 5;}

console.log(x) //5

이처럼 var는 함수의 코드 블록만 지역 스코프로 인정하기 때문에, 함수의 코드 블록 외부의 일반 코드 블록에서 선언해도 지역 변수가 아닌 전역 변수가 된다.

  • 변수 호이스팅
console.log(foo); // undefined

foo = 123;

var 키워드로 변수를 선언하면 변수 호이스팅이 동작한다. 에러를 발생시키진 않지만 프로그램의 흐름상 맞지 않고 가독성을 떨어뜨린다.

let, const 키워드의 등장

앞에서 살펴본 var 키워드의 단점들을 보완하기 위해 ES6에서 새로운 변수 선언 키워드인 let과 const를 도입했다.


let 키워드

  • 변수 중복 선언 금지
let bar = 123;

let bar = 456;// SyntaxError: Identifier 'bar' has already been declared

let은 이름이 같은 변수를 중복 선언하면 문법 에러가 발생한다.

  • 블록 레벨 스코프
let foo = 1; // 전역 변수

{
  let foo = 2; // 지역 변수
  let bar = 3; // 지역 변수
}

console.log(foo); // 1
console.log(bar); // ReferenceError: bar is not defined

let으로 선언된 변수는 블록 레벨 스코프를 따른다. 전역에서 선언된 foo변수와 코드 블록 내에서 선언된 foo 변수는 다른 별개의 변수이다. 따라서 전역에서는 블록에서 선언된 bar변수를 참조할 수 없다.

  • 변수 호이스팅
console.log(foo); // ReferenceError: foo is not defined
let foo;

let 키워드로 선언한 변수를 변수 선언문 이전에 참조하면 참조 에러가 발생한다. ES6에서 도입된 let은 변수 호이스팅이 발생하지 않는 것처럼 동작한다. (아예 호이스팅이 발생하지 않는다는 것은 아니다.)


const 키워드

  • 선언과 초기화
const foo; // SyntaxError: Missing initializer in const declaration

const foo = 1;

const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화해야 한다. 그렇지 않으면 문법 에러가 발생한다.

const 키워드로 선언한 변수도 let 키워드와 마찬가지로 블록 레벨 스코프를 가지며, 변수 호이스팅이 발생하지 않는 것처럼 동작한다.

  • 재할당 금지
const foo = 1;
foo = 2; // TypeError: Assignment to constant variable

const 키워드로 선언한 변수는 재할당이 금지된다.

  • 상수
const TAX_RATE = 0.1;

let preTaxPrice = 100;

let afterTaxPrice = preTaxPrice + (preTaxPrice * TAX_RATE); 

상수는 상태 유지와 가독성, 유지보수의 편의를 위해 적극적으로 사용해야 한다. 쉽게 바뀌지 않는 값은 상수로 정의하여 의미를 알기 쉽게 하고 고정값으로 사용할 수 있다.

일반적으로 상수의 이름은 대문자로 선언해 상수임을 명확히 나타내야 한다. 여러 단어로 이루어진 경우에는 언더스코어(_)로 구분해 스네이크 케이스로 표현하는 것이 일반적이다.

profile
노션 및 티스토리로 이동 예정입니다.
post-custom-banner

0개의 댓글