회사에서 Angular를 사용한 제품이 존재하여 해당 코드를 분석해야 했다. 하지만 Typescript나 Angular에 대한 지식이 없어 해당 내용에 대한 학습이 필요했다. 그래서 TS나 Angular를 공부하는 김에 ES6 문법도 다시 정비하려고 한다...
기존에 사용하던 var 대신 사용할 수 있는 선언문
+ var는 같은 변수에 여러번 재사용 가능했으나 let, const는 불가능
ex)
// var
var num = 6;
var num = 5; // 정상적으로 동작 -> nun = 5
// let
let num2 = 6;
let num2 = 5; // error -> 같은 변수에 재선언 불가능
num2 = 5 // 정상적으로 동작 -> num2 = 5
//const
const num3 = 6;
const num3 = 5; // error -> 같은 변수에 재선언 불가능
num3 = 5; // error -> 같은 변수에 재할당 불가능 즉, 상수화 됨
ex)
// var
x = 3 // x가 선언 되어 있지 않다면, 선언하고 초기화. 단, 호이스팅은 발생하지 않는다.
console.log(`${x} + ${y}`) // 위에서 선언된 x와 호이스팅되어 초기화된 y를 출력 -> 3 + undefined
var y = 3 // y를 선언하고 3을 초기화. var를 사용하여 호이스팅 또한 이뤄짐
// let
console.log(z) // error -> z는 메모리에 공간은 할당 받았지만, 초기화 되어 있지 않아 사용할 수 없다.
let z = 3; // 호이스팅 발생으로 메모리 공간을 할당 받지만, 초기화는 이 라인에서 이뤄짐
변수에 접근할 수 있는 범위로 글로벌 스코프
와 지역 스코프
가 존재
ex)
function a() {
var var_y = "func_vy";
if(var_y === "func_vy"){
let let_y = "block_ly";
console.log(var_y); // func_vy -> 함수 단위 스코프로 var_y가 유효함
console.log(let_y); // block_ly
}
console.log(var_y); // func vy
console.log(let_y); // error: let_y is not defined -> let의 경우 block 단위 스코프이기 때문에 if문을 나오면 해제됨
}
a();
스코프의 연결을 의미
JS는 EC(execution context)
를 통해 실행되는 데 EC는 글로벌과 함수 EC로 나뉜다.
Global execution context
Functional execution context
전체 구조는 스택을 따르며 해당 스코프에 필요한 변수가 없을 경우 그 전에 있던 스코프를 참조한다.
ex)
var v = "전역 변수";
function a() {
//function a Execution Context(EC)
var v = "지역 변수";
function b() {
//function b Execution Context
console.log(v);
}
b();
}
//Global Execution Context
a();
이 코드를 보면 우선 GEC가 생성되고, a() 그리고 b()순으로 쌓이게 된다.
하지만 이 때 b() 스코프에서는 v가 존재하지 않기 때문에 바로 상위 스코프인 a()에서 v를 참조하여 지역변수로 출력하게 된다.
이 때 만약 a()에 v가 없다면 전역변수 v를 참조하게 되고, 전역변수 v마저 없다면 에러를 발생하게 된다.