스코프(Scope)와 클로저(Closure)

Yun·2024년 3월 6일
0

개인공부

목록 보기
8/28

스코프는 현재 실행되는 컨텍스트를 말한다. 여기서 컨텍스트는 값과 표현식이 표현되거나 참조될 수 있음을 의미한다. 만약 변수 또는 다른 표현식이 해당 스코프 내에 없다면 사용할 수 없다.

스코프(Scope)

  • 스코프는 선언된 변수에 접근할 수 있는 유효한 범위이다.

  • 계층적인 구조이기 때문에 하위 스코프는 상위 스코프에 접근할 수 있지만, 상위 스코프는 하위 스코프에 접근할 수 없다.

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 같은 몇몇 언어에서 사용하는 방식이다.


클로저는 주변 상태에 대한 참조와 함께 묶인 함수의 조합입니다. 즉, 클로저는 내부 함수에서 외부 함수의 범위에 대한 접근을 제공합니다.

클로저 (Closure)

  • 클로저는 함수 안에 함수를 선언한 환경에서의 관계를 의미한다.

  • 외부 함수의 실행이 끝나고 외부 함수가 소멸된 이후에도, 내부 함수는 외부 함수의 변수에 접근할 수 있다.

  • 자바스크립트에서 리턴되는 함수는 클로저를 형성하기 때문에, 자신이 선언되었을 때의 환경(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;

클로저의 장점

  • 데이터를 보존할 수 있다. 특정 데이터를 스코프 안에 가두어 둔 채로 사용할 수 있는 폐쇄성이 있다.

  • 정보의 접근을 제한한다. (캡슐화)

  • 모듈화에 유리하다. 클로저 함수를 각각의 변수에 할당하면 각자 독립적으로 값을 사용하고 보존할 수 있기 때문이다.


출처

0개의 댓글