스코프는 영어로 범위라는 뜻 즉, 자바스크립트에서의 스코프란 변수에 접근할 수 있는 범위를 말한다
전역스코프 / 지역스코프로 나뉜다
전역은 말그대로 전역에 선언 되어있어서 어느 곳에서든지 해당 변수에 접근이 가능 지역은 해당 지역에서만 접근할 수 있어 지역을 벗어난 곳에선 접근 불가능
var a = 1; // 전역 스코프
function print() { // 지역 스코프
var a = 111;
console.log(a);
}
print(); // 111
console.log(a); //1여기서 함수 안에 있는 a의 선언을 지우면 print(); //1이 출력됨
console.log(a); //1
console.log(a) //1 이렇게 나온 이유는 function print()는 문서 내에 존재하지만 호출이 된건 아니라서 그냥 전역 변수로 출력이 되는 것임
저런게 일반적인데 굳이 이야기하자면 함수 스코프라고 부르고 블록 스코프라는게 있는데 말그대로 {} <-- block이라는 중괄호로 둘러싸인 부분이 블록이다. 그럼 엄밀히 따지자면
function print() { // 함수 블록
console.log(a);
}
{ // 블록
const a = '1';
}
이라고 볼 수 있다.암튼 스코프는 변수의 선언 위치에 의해서 스코프를 가진다 라는게 핵심이다.
전역에서 선언된 변수는 전역 스코프를 갖는 전역변수고
지역에서 선언된 변수는 지역 스코프를 갖는 지역변수가 된다고 이해하면 됨
- 예제1
// 외부 함수
function closuer() {
// 변수 정의
var count = 0;
// 내부 함수(클로저) 선언
function inner() {
return ++count;
}
// 내부 함수 반환
return inner();
}- 예제 2
function outter(){ //외부함수
var title = 'coding everybody'; //inner 함수의 외부 지역변수
function inner(){ //내부함수
alert(title); //외부함수의 지역변수에 접근할수 있다.
}
inner();
}
outter();실행이 8행(마지막줄)으로 넘어오면 outter 함수는 실행이 끝났기 때문에 이 함수의 지역변수는 소멸(종료)되는 것이 자연스럽다. 하지만 8행에서 함수 inner를 실행했을 때 coding everybody가 출력된 것은 외부함수의 지역변수 title이 소멸되지 않았다는 것을 의미한다.
클로저는 내부 함수가 정의될때 외부 함수의 환경을 기억하는 내부함수이다. 자신을 포함하고 있는 외부 함수의 인자, 지역변수 등을 외부 함수가 소멸(종료)된 후에도 사용할 수 있다
클로저랑 내부함수와 밀접한 관계가 있다. (뗄레야 뗄수없는 거라고 생각하면 됨) 내부함수는 외부함수의 지역변수에 접근할수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 후에도 내부함수가 외부함수의 변수에 접근할 수 있다. 클로저는 독립적인(자유)변수를 가리키는 함수이다. 또는, 클로저 안에 정의된 함수는 만들어진 환경을 '기억한다.' 외부 함수에서 선언된 내부함수는 그 외부 함수의 지역변수나 함수에 접근 가능!
내부함수가 외부함수의 지역변수에 접근 할 수 있고, 외부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸(종료)될 때까지 소멸(종료)되지 않는 특성.
심플하게 생각하면 함수 + 함수를 둘러싼 환경이 클로저라고 보면 됨
- 익명함수가 사용될 것
- 함수내부에서 함수 사용될 것
- 무분별한 전역함수의 사용억제
- 변수간 충돌 발생을 막을 수 있다
- 복잡한 코드를 간결하게