ES6는 이크마에서 2015년에 채택한 자바스크립트 표준이다. ES6 이후로 자바스크립트에는 많은 변화가 있었다. 새로 추가된 기능이 많은데 같이 알아봅시다 ! 😃
변수를 정의하는 새로운 방법 const, let
es5까지의 자바스크립트에서는 var를 이용해서 변수를 정의했고 그게 유일한 방법이었다면 ES6에서는 const / let을 이용하는 새로운 변수 정의 방법이 생겼다. 새로운 방법이 나온 이유는 기존 방식으로는 해결되지 않는 문제가 있었기 때문이다. 자바스크르립트가 저급한 언어라고 무시당하던(?) ES6 이전 시절, var가 그 비난에 한몫하지 않았을까 싶다.
var가 가진 문제를 알아보자
1. var = 함수 스코프
- var의 첫 번째 문제는 정의된 변수가 함수 스코프를 가진다는 것이다. 스코프란 변수가 사용될 수 있는 영역을 말한다. 스코프는 변수가 정의된 위치에 의해 결정된다. var로 정의된 변수는 함수를 벗어난 영역에서 사용하면 에러가 발생한다.
function example() {
var i = 1;
}
console.log(i);
var 변수를 함수가 아닌 프로그램의 가장 바깥에 정의하면 전역 변수가 되는데, 이는 프로그램 전체를 감싸는 하나의 함수가 있다고 생각하면 이해하기 쉽다. 특이한 점은 함수 안에서 var 키워드를 사용하지 않고 변수에 값을 할당하면 그 변수는 전역 변수가 된다는 점이다. var는 함수 스코프이기 때문에 for 반복문에서 정의된 변수가 반복문이 끝난 이후에도 계속 남는 문제점이 있다. for 문 뿐만 아니라 while문, switch문, if문 등 함수 내부에서 작성되는 모든 코드는 같은 문제를 안고 있다. var 변수의 스코프를 제한하기 위해 즉시 실행 함수를 사용하기도 한다.
즉시 실행 함수란 ?
함수를 정의하는 시점에 바로 실행되고 사라진다. var 변수는 함수 스코프이므로 즉시 실행 함수로 묶으면 변수의 스코프를 제한할 수 있다. 그러나 즉시 실행 함수는 작성하기 번거롭고 가독성도 떨어진다.
2. 호이스팅
var로 정의된 변수는 그 변수가 속한 스코프의 최상단으로 끌어올려진다. 이를 호이스팅이라고 부른다. 호이스팅은 직관적이지 않으며, 보통의 프로그래밍 언어에서는 찾아보기 힘든 성질이다.
3. 재정의
var myvar = 1;
var myvar = 2;
var를 이용하면 한 번 정의된 변수를 재정의할 수 있다. 변수를 정의한다는 것은 이전에 없던 변수를 생성한다는 의미로 통용된다. 따라서 앞의 코드가 에러 없이 사용될 수 있다는 것은 직관적이지 않으며 버그로 이어질 수 있다.
위에 같은 var의 문제를 해결해주는 const, let !
const, let은 블록 스코프다. var는 함수 스코프였지만 const,let은 블록 스코프라 부른다. 블록 스코프에서 if 문의 블록 안에서 정의된 변수는 if 문을 벗어나면 참조할 수 없다. if 문에서 생성된 변수를 블록 바깥에서 사용하려고 하면 에러가 발생한다. 이러한 상황에서 에러가 발생하는 것이 직관적이며 이해하기도 쉽다.
1. const,let에서의 호이스팅
const, let으로 정의된 변수도 호이스팅 된다. 하지만 const, let으로 변수를 정의하기 전에 그 벼수를 사용하려고 하면 참조 에러가 발생한다.
console.log(foo); //참조에러
const foo = 1;
똑같은 경우 var는 에러가 발생하지 않는다. 따라서 const, let으로 정의된 변수는 호이스팅이 되지 않는다고 생각하기 쉽다. 하지만 const, let으로 정의된 변수도 호이스팅되나. 다만 변수가 정의된 위치와 호이스팅된 위치 사이에서 변수를 사용하려 하면 에러가 발생한다. 이 구간을 임시적 사각지대라고 부른다.
2. const는 변수를 재할당 불가능하게 만든다.
const로 정의된 변수는 재할당이 불가능하다. 반대로 let, var로 정의된 변수는 재할당 할 수 있다. 재할당 불가능한 변수는 프로그램의 복잡도를 상당히 낮춰주기 때문에 되도록이면 재할당 불가능한 변수를 사용하는 게 좋다. 이미 존재하는 속성값을 수정하거나 새로운 속성값을 추가하는 것 모두 가능하다. 객체의 내부 속성값도 수정 불가능하게 만들고 싶다면 immer, immutable.js 등의 외부 패키지를 활용하는게 좋다. 이러한 외부 패키지는 객체를 수정하려 할 때 기존 객체는 변경하지 않고 새로운 객체를 생성한다. 새로운 객체를 생성하는 편의 기능은 필요 없고 단지 수정만 할 수 있도록 차단하고 싶다면, 이런 자바스크립트 내장 함수를 이용하면 된다.
- Object.preventExtenstions
- Object.seal
- Object.freeze
그리고 const로 정의 했다면 객체를 참조하는 변수 자체를 변경하는 것은 불가능 !
'JavaScript' 카테고리의 다른 글
클로저 개념 (0) | 2021.04.05 |
---|---|
ES6+ 함수의 화살표 함수 알아보기 (0) | 2021.04.05 |
es6+ 객체 비구조화 그리고 강화된 ES6+ 함수의 기능 (0) | 2021.04.05 |
ES6+ 자바스크립트 복습! 객체와 배열의 사용성 개선하기 (0) | 2021.03.30 |