바깥쪽 스코프에서 선언한 변수는 안쪽 스코프에서 사용 가능!
[예시 : greeting 변수는 바깥에 정의되어 있으므로 함수 안쪽에서 사용 가능]
안쪽 스코프에서 선안한 변수는 바깥쪽 스코프에서 사용 불가능!
[예시 : firstName 변수는 함수 안쪽에 정의되어 있으므로 접근 불가능 (ReferenceError)
블록 스코프 (block scope) : 중괄호 기준으로 범위가 구분
[예시]
1) 블록스코프 안에서 정의된 변수 i는 블록 범위를 벗어나게 되면 접근 x
2) 1번의 선언을 let 대신 var를 이용하면 출력이 됨
⇒ var 키워드는 for문이 만들어낸 블록 스코프를 무시
함수 스코프 (function scopt) : function 키워드가 등장하는 함수 선언식 및 함수 표현식
❗️ 화살표 함수는 블록 스코프로 취급
var,let,const 키워드
- var : 블록 스코프를 무시하고, 함수 스코프만 따름/ 화살표 함수의 블록스코프는 무시 x
- let : 블록 단위로 스코프를 수분햇을때는 훨씬 더 예측이 가능한 코드를 작성할 수 있음 (재선언을 방지)
- const(상수) : let키워드와 동일하게 블록스코프를 따름/
재할당이 불가능 ⇒ 의도치 않은 값의 변경을 막을 수 있음
내부함수와 외부함수
- 내부 함수 : 함수 안의 또 다른 함수
→ 외부함수의 지역 변수에 접근할 수 있음
외부 함수 : 제일 바깥에 있는 외부 함수
[예시]
1) 함수 outerFn과 outerFn에서 접근할 수 있는 globalVar
2) 함수 innerFn과 innerFn에서 접근할 수 있는 globalVar, outerFnVar
클로저가 중요한 이유 : 클로저의 함수는 어디에서 호출되느냐와 무관하게 선언된 함수 주변 환경에 따라 접근할 수 있는 변수가 정해짐
[예시]
innerFnOnGlobal은 innerFn 밖에 있기 때문에 outerFnVar에는 접근하지 못할거라고 판단하지만 실제론 접근이 가능하다
➡️ 아래 그림처럼 innerFn 함수가 최초 선언되었던 환경에서 outerFnVar에 접근가능하기 때문!