클로저란 함수 내부에 만든 지역변수가 사라지지 않고 계속해서 값을 유지하고 있는 상태를 말한다.
일반 지역변수의 경우 함수 호출이 완료되면 그 값이 사라지는게 원칙이다.
하지만 클로저를 이용하면 함수 호출이 완료된 후에도 사라지지 않는 데이터 저장소를 만들 수가 있다.
내부 함수의 실행 시점에서 외부함수가 종료된 시점이라 하더라도 가비지 셀렉터의 동작방식으로 인해 외부 함수의 Lexical Environment에 접근이 가능하다. (가비지 셀렉터는 어떤 값을 참조하는 변수가 하나라도 있다면 그 값은 수집대상에 포함하지 않는다)
이러한 원리로 외부함수에서 선언한 변수를 내부함수로 전달할 경우 외부함수가 종료된 이후에도 변수가 사라지지 않는다.
once = function (func) {
let called = false;
let result = 0;
return function (){
if(!called){
result = func(arguments);
called = true;
}
return result;
}
};
// --------------------------------------
const add = function (){
num ++;
}
once(add);
once(add);
once(add);
console.log(once(add)); // 1
⭐️ once function에서 변수 called를 내부 함수로 전달해 내부함수에서 True로 값이 변경이 되었기 때문에 이후 once를 몇번을 호출해도 출력은 1이 된다.