[JS] 모던 자바스크립트 Deep -let, const 키워드와 블록 스코프

이정후·2022년 7월 3일
0

자바스크립트

목록 보기
5/14
post-thumbnail

며칠전 공부했던 변수와 관련하여 더 깊고 자세한 내용을 알게되어 정리하고자 한다.

var, let, const에 대하여

1.var 변수 선언의 문제점

var로 선언한 변수는 중복 선언이 가능하다.


이 코드를 실행하면
다음과 같은 결과를 얻게 된다.

예제의 var 키워드는 중복 선언 되었다. var로 선언한 변수를 중복 선언하면 초기화문(변수 선언과 동시에 초기값을 할당하는 문) 유무에 따라 다르게 동작한다.

초기화문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작하고 초기화문이 없는 변수 선언문은 무시된다. 에러는 발생하지 않는다. 그래서 위의

var y;

는 생략된 것이다.

1-1함수 레벨 스코프

var 키워드로 선언한 변수는 오직 함수 블록만을 스코프로 인정한다.
함수 외부에서 var로 선언한 변수는 블록코드 내에서 선언해도 모두 전역 변수가 된다.

var x = 1;

if(true) {
	var x = 10;
}

console.log(x); // 10

위 예제 코드에서 x는 전역 변수이다. 이미 선언된 x가 있으므로 if 문 안에서 x는 중복선언된다. 이는 의도치 않게 변수값이 변하는 결과를 가져온다.

x의 값이 1이 아니라 10이 된 것을 말한다.

for문에서도 마찬가지이다.

var i = 10;

for(let i = 0; i < 5; i++) {
	console.log(i); // 0, 1, 2, 3, 4 
}
console.log(i); //5

1-2변수 호이스팅

var 키워드를 사용하면 '변수 호이스팅'에 의해 변수 선언문이 스코프의 맨 위(선두)로 끌어 올려간 것 처럼 동작한다. 변수 호이스팅에 의해 var 키워드로 선언한 변수는 선언문 이전에 참조할 수 있다. 그러나 할당문 이전에 변수를 참조하면 언제나 undefined를 반환한다.

2. let

이러한 var의 단점을 보완하기 위해 ES6에서 새로운 변수 키워드인 let과 const가 도입되었다.

2-1 변수 중복 선언의 금지

var는 중복되는 이름의 변수를 선언해도 아무런 문제(에러)가 되지 않는다. 이때 중복 선언되면서 값까지 할당했다면 의도치 않게 먼제 선언된 변수의 값이 재할당되어 변경되는 부작용이 발생했다. 하지만 let을 통한 변수의 선언은 이러한 문제점을 막아준다.(SyntaxError)

'"hoo"는 이미 선언되어 있다.'의 에러이다.

let, const로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용하지 않는다.

2-2 블록 레벨 스코프


let 키워드로 선언된 변수는 블록 레벨 스코프를 따른다. 따라서 위 코드 블록 내에서 선언된 hoo 변수와 bar 변수는 지역변수이다. 전역에서 선언된 hoo와 블록에서 선언된 hoo는 다른 변수이다. 또한 bar도 블록 레벨 스코프를 갖는 지역 변수이다.

따라서, 전역세서는 bar를 참조할 수 없다. 그래서 ReferenceError를 리턴하는 것이다.

2-3 변수 호이스팅(let)

var 키워드로 선언한 변수와 달리 let 키워드로 선언한 변수는 변수 호이스팅이 발생하지 않는 것처럼 동작한다.

3. const

Constant는 '상수'라는 뜻으로 상수를 선언하기 위해서 사용한다. 그러나 반드시 상수만을 위해 사용하지는 않는다.

const foo = 1;

const로 선언한 변수는 선언과 동시에 초기화 해야한다.

const hoo; //SyntaxError: Missing initiallizer in const declaration

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

3-1 재할당 금지

var 또는 let 키워드로 선언한 변수는 재할당이 자유로우나, const로 선언한 변수는 재할당이 금지된다.

3-2 상수

const로 선언한 변수에 값을 할당한 경우, 값을 변경할 수 없다. 그러나 const로 선언된 변수에 객체를 할당한 경우 값을 변경할 수 있다. 변경 가능한 값인 객체는 재할당 없이도 직접 변경이 가능하기 때문이다.

const person = {
	name : 'Lee'
};

person.name = 'Kim";

console.log(person); // {name: "Kim"}

새로운 값을 재할당하는 것은 불가능하지만 프로퍼티의 동적 생성, 삭제, 프로퍼티 값 변경을 통해 객체를 변경하는 것은 가능하다. 이때 객체가 변경되더라도 변수에 할당된 참조 값은 변경되지 않는다.

4. 정리

변수는 기본적으로 const를 사용하고, let은 재할당이 필요한 경우에 한정해 사용하는 것이 좋다.
var, let, const 키워드는 다음과 같이 사용하는 것을 권장한다.

  1. ES6를 사용한다면 var 키워드는 사용하지 않는다.
  2. 재할당이 필요한 경우에 한정해 let사용, 이때 변수 스코프는 최대한 좁게
  3. 변경이 없거나 읽기 전용으로 생성하는 경우, 원시값과 객체에는 const를 사용한다.

우선 변수를 const로 선언하고 추후에 리팩토링 과정에서 재할당이 필요하다면 let 키워드로 바꿔주는 습관을 가져야겠다.

profile
꾸준하게

0개의 댓글