본문 바로가기

JavaScript

클로저 - 원래 스코프 내부에서는 외부로 접근 가능한거 아니야?

스코프

  • 스코프는 변수와 함수가 접근할 수 있는 유효 범위를 말한다.
  • 자바스크립트에는 전역 스코프, 함수 스코프, 블록 스코프가 있다.
    • 전역 스코프: 코드 어디서든 접근 가능한 범위.
    • 함수 스코프: 함수 내부에서만 접근 가능한 범위.
    • 블록 스코프: 블록({}) 내부에서만 접근 가능한 범위, let과 const로 선언된 변수에 적용.

기본적으로 스코프 내부에서는 외부 스코프의 변수에 접근할 수 있다. 이것은 자바스크립트의 기본 스코프 규칙이다.

let globalVar = "I am global";

function outerFunction() {
    let outerVar = "I am outer";

    function innerFunction() {
        let innerVar = "I am inner";
        console.log(globalVar); // "I am global"
        console.log(outerVar); // "I am outer"
        console.log(innerVar); // "I am inner"
    }

    innerFunction();
}

outerFunction();

 

클로저

  • 클로저는 함수가 선언된 어휘적 환경(스코프)을 기억하는 함수이다.
  • 클로저는 함수가 자신의 스코프 밖에서 호출될 때도 그 스코프의 변수에 접근할 수 있게 한다.

클로저라는 이름이 붙는 이유는 함수가 스코프 외부에서 호출되더라도, 자신이 선언된 환경을 기억하고 그 환경에 접근할 수 있기 때문이다. 즉, 클로저는 함수와 그 함수가 선언된 어휘적 환경의 조합이다.

function outerFunction() {
    let outerVar = "I am outer";

    return function innerFunction() {
        console.log(outerVar);
    };
}

let closureFunction = outerFunction();
closureFunction(); // "I am outer"

위 예시에서 outerFunctionouterVar라는 변수를 가지고 있으며, innerFunction을 반환한다. innerFunctionouterVar에 접근할 수 있다. 중요한 점은 closureFunctionouterFunction의 실행이 끝난 후에도 outerVar에 접근할 수 있다는 것이다. 이는 innerFunctionouterFunction의 어휘적 환경을 기억하는 클로저이기 때문이다.

 

즉 반환값 같은 개념이다.  내부 스코프로 만들어진 변수를 반환하면 외부에서도 그 변수를 사용할 수 있는데 이를 클로저라고 한다.

'JavaScript' 카테고리의 다른 글

실습  (0) 2024.05.24
ES6  (0) 2024.05.23
객체  (0) 2024.05.22
클로저  (0) 2024.05.22
스코프  (0) 2024.05.22