변수/함수는 프로그램의 어느 곳에서도 선언하여 사용할 수 있다. 다만 선언된 위치에 따라 영향을 미치는 범위가 한정된다. 이와 같이 변수/함수가 적용되는 범위를 유효범위(scope)라고 한다. 변수/함수는 유효범위에 따라 '전역 스코프'와 '함수 스코프', '블록 스코프'로 구분된다.
전역스코프
전역 스코프는 전체 코드에서 접근 가능한 변수와 함수이다. 함수 밖에서 변수를 선언하여 사용한다.
** 전역 스코프의 변수와 함수 스코프의 변수가 같은 이름으로 명시되면 유효한 범위 내에서 함수 스코프 변수가 먼저 적용된다.
** HTML 파일에서 <script>태그로 포홤된 파일 간에도 전역 스코프의 변수에 접근할 수 있다.
(<script type = "module">은 제외)
함수 스코프
특정 함수 내에서만 접근 가능한 변수로, 함수 내부에서 선언된 변수는 외부에서 접근할 수 없다.
따라서 함수가 실행될 때 생성되고, 함수의 실행이 종료되면 변수의 유효성이 사라진다.
함수 스코프의 변수를 사용하기 위해서는 함수 안에 'var'을 붙여서 새롭게선언해야한다. 이렇게 선언하지 않으면 전역 스코프의 변수를 참조하는 경우가 된다.
** 함수 내부에 선언된 함수는 중첩 함수 혹은 내부 함수라고 한다. 내부 함수의 스코프는 본인을 포함한 외부 함수의 스코프를 따른다. 내부 함스는 외부 함수의 변수 뿐만 아니라 본인의 내부 변수에도 접근 가능하다.
블록 스코프
원래 함수 스코프까지 지원하였으나, 변수가 함수 내에서만 유효하다보니 블록 내 (if문, while문 등)에서 선언된 변수는 외부에서 접근이 가능하여 코드의 가독성과 유지보스를 어렵게 만들었다.
그로 인하여 let과 const 키워드로 선언된 변수는 해당 블록 내에서만 유효하도록 블록 스코프에 대한 개념이 추가로 생기게 되었다.