스코프란?(scope)
식별자(identifier, 변수, 함수, 클래스의 이름)가 유효한 범위를 말한다. var로 선언한 변수와 let,const키워드로 선언한 변수의 스코프는 서로 다르게 동작한다. 예시 ) 서울에 A라는 사람이 살고 있을 때, 서울이라는 범위 내에선 A의 존재를 찾을 수 있고, 서울 밖에서는 A를 찾을 수 없다. 이때 서울이 스코프인 것이다. 만약 서울 외 지역에서 A를 찾게되면, A를 찾을 수 없다며 참조에러(ReferenceError)가 발생할 것이다.
스코프가 필요한 이유
1. 같은 이름을 가진 식별자들끼리 충돌이 일어나다. 2. 함수 내에서만 활동하는 변수와 함수 밖에 있는 변수가 중복 선언으로 간주되어 에러가 발생된다.
스코프의 종류
전역 스코프 (global scope)
코드의 가장 바깥 영역을 말한다. 함수나 (if문,for문,while문 등)에서 가장 바깥에 있는 영역을 뜻함 어디서든 이 변수를 사용 할 수 있다.
지역 스코프 (local scope)
함수나 (if문,for문,while문 등)의 내부 영역을 뜻함 자신의 지역 스코프와 하위지역 스코프에서만 사용 가능하다. 지역 스코프에는 함수 스코프와 블록 스코프 2가지가 있다.
지역 스코프 - 함수 레벨 스코프
함수 블록만 지역 스코프로 인정해주는 특징이 있다. 함수 내에 선언된 변수는 함수 내에서만 사용 할수 있고, 함수 외의 (if문,for문,while문 등)은 지역 스코프로 인정하지 않기 때문에 전역에서도 스코프의 경계를 무시하고 지역 변수를 참조 할수 있다.
지역 스코프 - 블록 레벨 스코프
자바스크립트는 다른 언어와 달리 함수 레벨 스코프를 따르는 언어이다. (if문,for문,while문 등)을 지역 스코프로 인정해주는 특징을 말한다. 내부에 선언된 지역 변수는 블록 내부에서만 접근이 가능하다.
스코프 체인 (scope chain)
자바스크립트 엔진의 경우 함수가 호출되는 시점에 상위 스코프 방향으로 선언된 변수를 검색한다. 스코프가 계층적으로 만들어져 있는것을 스코프 체인이라 한다.
동적 스코프, 렉시컬 스코프
동적 스코프 함수가 호출되는 시점에 상위 스코프를 결정한다. 유일한 자바스크립트 언어만 동적 스코프를 따른다.
렉시컬 스코프 함수 정의가 평가되는 시점(주로 컴파일)에 상위 스코프가 결정된다. 대부분의 언어가 렉시컬 스코프를 따른다.