클로저

JavaScript 얻은 것 중에 최고는 클로저입니다. JavaScript에 함수는 바깥쪽에 정의된 어떤 변수도 접근할 수 있습니다. 클로저는 예제로 가장 잘 설명됩니다.:

function outerFunction(arg) {
    var variableInOuterFunction = arg;

    function bar() {
        console.log(variableInOuterFunction); // 바깥쪽에 있는 변수 접근
    }

    // arg 접근하는 것을 시연하는 지역 함수 호출
    bar();
}

outerFunction("hello closure"); // hello closure 출력!

안쪽에 있는 함수가 바깥쪽에 있는 변수에 (variableInOuterFunction) 접근할 수 있습니다. 안쪽 함수가 바깥쪽 변수를 가두었습니다. (또는 묶었습니다) 그래서 클로저(closure)라고 합니다. 그 자체로 개념은 간단하고 꽤 직관적입니다.

이제 멋진 부분: 바깥쪽 함수가 반환된 후에도 안쪽 함수는 바깥쪽의 변수에 접근할 수 있습니다. 바깥 함수에 의존하지 않고, 여전히 변수는 안쪽 함수에 엮여 있기 때문입니다. 다시 예를 살펴보겠습니다.:

function outerFunction(arg) {
    var variableInOuterFunction = arg;
    return function() {
        console.log(variableInOuterFunction);
    }
}

var innerFunction = outerFunction("hello closure!");

// outerFunction이 반환되었음에 주목하세요
innerFunction(); // hello closure를 출력!

왜 이것이 굉장한 이유

예로 공개 모듈 패턴같이 객체 만들기가 쉽습니다.:

function createCounter() {
    let val = 0;
    return {
        increment() { val++ },
        getVal() { return val }
    }
}

let counter = createCounter();
counter.increment();
console.log(counter.getVal()); // 1
counter.increment();
console.log(counter.getVal()); // 2

높은 수준에서 Node.js같은 것을 만들 수 있습니다. (지금 바로 머릿속에서 이해가 안 되더라도 걱정하지 마세요. 곧 그렇게 될 것입니다. 🌹):

// 개념 설명을 위한 의사 코드
server.on(function handler(req, res) {
    loadData(req.id).then(function(data) {
        // `res`는 가뒀고 사용 가능
        res.send(data);
    })
});

results matching ""

    No results matching ""