스코프는 현재 실행되는 컨텍스트를 말한다. 여기서 컨텍스트는 값과 표현식이 표현되거나 참조될 수 있음을 의미한다. 만약 변수 또는 다른 표현식이 해당 스코프 내에 없다면 사용할 수 없다.
스코프는 선언된 변수에 접근할 수 있는 유효한 범위이다.
계층적인 구조이기 때문에 하위 스코프는 상위 스코프에 접근할 수 있지만, 상위 스코프는 하위 스코프에 접근할 수 없다.
const top_scope = () => {
const message = "access";
const sub_scope = () => {
console.log(message); //asccess
};
}
console.log(message); //error
스코프 체인은 현재 스코프 레벨에서 변수가 존재하지 않는 경우 상위 스코프에서 찾는 것을 의미한다. 스코프는 안에서 바깥쪽으로 단계적으로 탐색한다.
스코프는 정적 스코프(렉시컬 스코프)와 동적 스코프로 나뉜다.
정적 스코프 (Static Scope) = 렉시컬 스코프 (Lexical Scope)
자바스크립트에서 스코프를 결정하는 방식이다. 다수의 프로그래밍 언어가 정적 스코프를 사용한다.
함수를 선언한 시점에 스코프를 결정하는 방식을 의미한다.
함수가 중첩되어 있을 때, 내부 함수에 해당 변수가 존재하지 않을 경우 상위 스코프에서 해당 변수를 찾는다.
let s = "Global Variable";
function func1() {
let s = "Local Variable";
console.log(s); // Local Variable
func2();
}
function func2() {
console.log(s); // Global Variable
}
func1();
동적 스코프(Dynamic Scope)는 호출한 시점에 스코프를 결정하는 방식이다.
자바스크립트는 동적 스코프를 사용하지 않지만, this 매커니즘과 비슷하다.
Bash Scripting이나 Perl 같은 몇몇 언어에서 사용하는 방식이다.
클로저는 주변 상태에 대한 참조와 함께 묶인 함수의 조합입니다. 즉, 클로저는 내부 함수에서 외부 함수의 범위에 대한 접근을 제공합니다.
클로저는 함수 안에 함수를 선언한 환경에서의 관계를 의미한다.
외부 함수의 실행이 끝나고 외부 함수가 소멸된 이후에도, 내부 함수는 외부 함수의 변수에 접근할 수 있다.
자바스크립트에서 리턴되는 함수는 클로저를 형성하기 때문에, 자신이 선언되었을 때의 환경(Lexical Environment)에서의 스코프를 기억한다.
스코프를 이용해 변수의 접근 범위를 제한하는 것에 의미가 있다.
내부 함수가 상위 스코프의 식별자를 참조하고 있고, 그 상위 스코프 바깥에서 사용했을 때 상위 스코프의 식별자를 수정할 수 없는 형태이다.
function outerFn() {
let x = 10;
return function innerFn(y) { //클로저
return x = x + y;
}
}
let a = outerFn(); // 외부함수 호출. 이제 a 변수는 innerFn 함수를 참조한다.
a(5); // 15;
a(5); // 20;
a(5); // 25;
데이터를 보존할 수 있다. 특정 데이터를 스코프 안에 가두어 둔 채로 사용할 수 있는 폐쇄성이 있다.
정보의 접근을 제한한다. (캡슐화)
모듈화에 유리하다. 클로저 함수를 각각의 변수에 할당하면 각자 독립적으로 값을 사용하고 보존할 수 있기 때문이다.