코드팩토리 JS

26. closure

박성하하 2025. 12. 27. 17:44
728x90
반응형
/**
 * Closure
 * A closure is the combination of a function and the lexical
 * environemnt within which that function was declared
 * "클로저는 어떤 함수와 해당 함수가 선언된 렉시컬 환경의 조합이다."
 * "상위 함수보다 하위 함수가 더 오래 살아있는 경우를 closure라고 한다."
 */
function getNumber() {
    var number = 5;
    function innerGetNumber() {
        return number;
    }
    return innerGetNumber();
}

function getNumber() {
    var number = 5;
    function innerGetNumber() {
        return number;
    }
    return innerGetNumber;
}

const runner = getNumber();
console.log(runner);
console.log(runner());

/**
 * 1) 데이터 캐싱
 */
function cacheFunction() {
    // 아래 계산은 매우 오래걸린다는 가정을 했을때
    var number = 10 * 10;
    function innerCacheFunction(newNumb) {
        return number * newNumb;
    }
    return innerCacheFunction;
}
const runner2 = cacheFunction();
console.log(runner2(10));               // 1000
console.log(runner2(20));               // 2000


function cacheFunction2() {
    var number = 99;
    function increment() {
        number++;
        return number;
    }
    return increment;
}

const runner3 = cacheFunction2();
console.log(runner3());             // 100
console.log(runner3());             // 101
console.log(runner3());             // 102
console.log(runner3());             // 103
console.log(runner3());             // 104
console.log(runner3());             // 105
console.log(runner3());             // 106

/**
 * 3) 정보 은닉
 */
function Idol(name, year) {
    this.name = name;
    var _year = year;

    this.sayNameAndYear = function () {
        return `안녕하세요 저는 ${this.name}입니다. ${_year}에 태어났습니다.`;
    }
}

const yuJin = new Idol('안유진', 2003);
console.log(yuJin.sayNameAndYear());        // 안녕하세요 저는 안유진입니다. 2003에 태어났습니다.

console.log(yuJin.name);                    // 안유진
console.log(yuJin._year);                   // undefined






function getNumber() {
    var number = 5;
    function innerGetNumber() {
        return number;
    }
    return innerGetNumber;
}

var runner4 = getNumber();
console.log(runner4());                     // 5
728x90
반응형

'코드팩토리 JS' 카테고리의 다른 글

28. callback hell , promise  (0) 2025.12.28
27. async theory  (0) 2025.12.27
25. execution context  (0) 2025.12.27
24. this  (0) 2025.12.27
23. scope  (0) 2025.12.27