스코프는 자바스크립트를 포함한 모든 프로그래밍 언어의 기본적이며 중요한 개념이므로 확실한 이해가 필요하다.
스코프는 참조 대상 식별자(자바스크립트의 변수의 선언)를 찾아내기 위한 규칙이다.
자바스크립트는 이 규칙대로 식별자를 찾는다.
전역에 선언된 변수는 어디에든 참조할 수 있다.
하지만 함수내에서 선언된 변수는 함수 내부에서만 참조할 수 있고 함수 외부에서는 참조할 수 없다.
이러한 규칙을 스코프라고 한다.
만약 이러한 규칙, 즉 스코프가 없다면 같은 식별자 이름(선언된 변수)이 충돌을 일으키므로 프로그램 전체에서 다 다른 식별자 이름을 사용하여야 한다.
스코프는 이러한 충돌을 방지해준다.
전역 스코프 - 전역 스코프는 코드 어디에서든지 참조가 가능하다.
지역 스코프 - 함수가 만든 스코프로 함수 자신과 하위 함수에서만 참조 가능하다.
전역 변수 - 전역에서 선언된 변수이며 어디에서든 참조가 가능하다.
지역 변수 - 지역(함수)내에서 선언된 변수이며 그 지역과 그 지역의 하부
변수를 선언하는 키워드 세 가지의 차이점과 스코프 유효 범위는 각각 다르다.
const
- 유효 범위 : 블록 스코프 / 함수 스코프
- 값 재할당 : 불가능
- 재선언 : 불가능
let
- 유효 범위 : 블록 스코프 / 함수 스코프
- 값 재할당 : 가능
- 재선언 : 불가능
var
- 유효 범위 : 함수 스코프
- 값 재할당 : 가능
- 재선언 : 가능
블록 스코프란 블록 레벨 스코프(block-level scope)라고 하고 코드 블록({...}) 내에서 유효한 스코프를 의미 한다. 대부분의 C-family language는 이 블록 스코프를 따른다.
함수 스코프란 함수 레벨 스코프(function-level scope)라고 하고 함수 코드 블록 내에서 선언된 변수는 함수 코드 블록 내에서만 유효하고 외부에서는 유효하지 않다.
for(let i = 0; i < 10; i++){
console.log(i)
}
// 전역스코프에서 선언한 변수 i는 존재하지 않음으로 참조에러를 일으킨다.
console.log(i) // ReferenceError(참조 에러)
for(var i=0; i<10; i++) {
console.log(i);
}
// var 키워드로 선언한 변수 i 는 지역 스코프에서 선언되었지만 모든 스코프에서 접근 가능하다.
console.log(i); // 10
그러나 블록 단위로 스코프를 구분했을 때, 훨씬 더 예측 가능한 코드를 작성할 수 있으므로 let 키워드의 사용이 권장된다.
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 1 실행한 위치가 아닌 선언한 시점을 확인
function foo () {
// 선언하지 않은 식별자
y = 20;
console.log(x + y);
}
foo(); // 30
poiemaweb - https://poiemaweb.com/js-scope
HANAMON - https://hanamon.kr/javascript-%EC%8A%A4%EC%BD%94%ED%94%84%EC%99%80-%EB%B3%80%EC%88%98%EC%84%A0%EC%96%B8%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%B0%A8%EC%9D%B4%EC%A0%90/