
const x = 1;
// 1
function outer(){
const x = 10;
const inner = function(){console.log(x)}; // 2
return inner;
}
const innerFunc = outer(); // 3
innerFunc() // 4
// 답 -> 10
// 3 outer 함수호출하면 중첩함수 inner 함수를 반환하며 생명주기 마감
// 지역변수와 값은 제거 되어서 접근 할 수 없을 것 같은데 10이 부활한듯 동작하네?
// 위에서 말한 외부함수보다 중첩함수가 더 오래 유지되는 함수가 생명주기가 끝난 외부 함수의 변수를 참조하네
// 이거시 클로저
// inner 함수는 전역변수 innerFunc에 의해 참조가 되고 있기에 가비지 컬렉션의 대상 X
//메모
// outer environment ref 는 실행될때 [[environment]]를 참조한다.
function cacheFunction(newNumber){
// 매우매우 복잡한 계산. 사실 진짜 엄청나게 오래걸림
var number = 10 * 10
return number * newNumber
}
console.log(cacheFunction(10));
console.log(cacheFunction(20)); ...
//만약 계산을 여러번 해야 한다? -> 반복적인 작업으로 인해 리소스를 많이 소비해야 한다
//아래의 방법으로 바꾸면? (with 클로저)
function cacheFunction(newNumber){
// 매우매우 복잡한 계산. 사실 진짜 엄청나게 오래걸림
var number = 10 * 10
function innerCacheFunc(newNumber){
return newNumber * number
}
return innerCacheFunc;
}
const storedNum = cacheFunction() //여기서 number의 계산을 한번만 진행
console.log(storedNum(10))
console.log(storedNum(20)) ...
//number라는 값을 클로저가 기억.
function cacheFunction2(){
var number = 99;
function increment(){
number++
return number
}
return increment;
}
const storedNum2 = cacheFunction2();
console.log(storedNum2()) // --> 100
console.log(storedNum2()) // --> 101
//increment는 number 값을 기억하고 있음
%클로저 주의점
부분적용함수 - 여러 개의 인자를 전달 가능실행결과 재 실행시, 원본 함수 무조건 실행
커링함수 - 한 번에 하나의 인자만 전달하는 것이 원칙중간 과정상의 함수를 실행한 결과는 그 다음 인자를 받기 위해 대기마지막 인자가 전달되기 전까지는 원본 함수가 실행되지 않음