0개 이상의 문statement들을 묶은 단위
일반적으로, 이후 배울 제어문, 함수 등에 사용
새로운 스코프 생성
블록 안에 선언된 변수와 상수를 밖에서 사용 불가
블록 안쪽에서는 바깥의 것 사용 가능
블록 안쪽에 변수나 상수가 새로 선언되면 바깥 것을 덮어씀
stack - LIFO 후입선출 나중에 온 것이 먼저 나감
블럭 안에 해당 변수/상수가 없으면 바깥족으로 찾아 나감 -> 체이닝
전역 global 변수/상수
데이터 data 영역에 위치
코드 어느 곳에서든 접근 가능 - 블록 내 동명의 변수나 상수에 덮어씌워지지 않는 이상
프로그램 종료시 소멸
⭐️ 전역변수 사용은 최소화할 것
지역 local 변수/상수
스택 영역에 위치
해당 블록 안에서만 접근 가능
블록 실행 종료시 소멸
⭐ 변수나 상수는 가능한 사용할 블록 내에서 선언 - 메모리 절약
+++ 09.02 추가
모든 변수는 스코프(scope, 범위)가 있다. var는 함수 스코프, let은 블록 스코프이다.
함수를 경계로 접근 가능 여부가 달라지는 것을 함수 스코프라고 하고 함수 스코프를 다르게 말하면 함수가 끝날 때 함수 내부의 변수도 같이 사라진다.
블록은 if, for, while 문 함수에서 볼 수 있는 중괄호({})를 의미한다. 블록 스코프를 다르게 말하면 블록이 끝날 때 내부의 변수도 같이 사라진다.
클로저(closure)는 외부 값에 접근하는 함수이다. 모든 자바스크립트 함수는 클로저 가 될 수 있다.
const func = () => {
console.log(a);
};
if (true) {
const a = 1;
func();
};
위 코드가 에러가 발생되는 이유는 변수 a는 if 문 안에서 선언되었고, func() 함수는 if문 바깥에서 선언되었다. const는 블록 스코프이므로 if문 바깥에서는 변수 a에 접근할 수 없다. func()함수도 if 문 바깥에 있으므로 변수 a에 접근할 수 없다.
이처럼 함수가 선언된 위치에 따라 접근할 수 있는 값이 달라지는 현상을 '함수는 정적 스코프(lexical scope)를 따른다 라고 표현한다. 선언된 위치가 아니라 호출된 위치에 따라 접근할 수 있는 값이 달라진다면 동적 스코프를 따르게 되는데 자바스크립트는 정적 스코프를 따른다.