1. 스코프
식별자의 유효 범위를 의미하며, 식별자를 검색할 때 사용되는 규칙을 의미한다.
const a = 1;
const f1 = () => {
const a = 3;
f2();
};
const f2 = () => {
console.log(a); // ?
};
f1();
위의 실행결과로 어떤값이 출력될까?
정답은 3이 아닌 1이 출력되는데, 이유로는 자바스크립트는 함수를 어디서 호출했는지에 따라 함수의 상위 스코프가 결정되는 동적 스코프가 아닌, 정의를 어디서 했는지에따라 함수의 상위 스코프를 결정하는 렉시컬 스코프를 따르기 때문이다.
2. 전역 변수의 문제점
스코프 체인상의 종점에 위치하기 때문에 변수를 검색할 때 가장 마지막에 검색된다. 따라서 참조에 있어 지역변수에 비해 느리다.
3. let/const 키워드와 블록 레벨 스코프
블록레벨 스코프는 함수를 포함한 if문, for문, while, try/catch문 등이 되겠다. var와 달리 let과 const는 블록 레벨을 지원하기 때문에 작은 단위로 로직을 구성할 수 있다.
var키워드와의 차이점으로는 let,const는 런타임 이전에 선언부만 실행된다는 점. 따라서 선언문이 작성된 코드라인 이전에 변수를 참조하게 되면 초기화가 이루어지지 않아 에러를 발생시킨다. 반면에 var키워드는 런타임 이전에 선언과 초기화가 동시에 진행되기 때문에(undefined로 할당) 선언 전에 참조를 진행해도 에러가 발생하지 않는다.
3.1 객체의 불변성유지.
객체는 변경이 가능하다는 속성이 있다. 이는 메모리 관리를 효율적으로 하기 위해 설계된 방식이지만 반면에 변경이 가능하여 에러를 발생시킬 확률이 높다. 따라서 불변함을 유지시켜 최대한 독립적으로 값을 관리하려 한다. 변경할 상황이 생긴다면 프로퍼티나 메서드를 직접 변경하지 말고, 아예 변경된 프로퍼티와 메서드를 가진 객체를 새로 할당시켜 기존의 객체와 의존성을 끊어낸다.