예제 1번
function makeCake() {
const ingredient = "chocolate"; // 재료
function cookCake() {
console.log("Making a " + ingredient + " cake!"); // 재료로 케이크 만들기
}
return cookCake; // 내부 함수 반환
}
const makeChocolateCake = makeCake(); // makeCake 함수 호출하여 내부 함수를 반환받음
makeChocolateCake(); // 내부 함수 호출
makeCake 함수는 다른 함수를 만드는 함수이다.
makeCake 함수 안에는 ingredient라는 변수
와 cookCake라는 내부 함수
가 있다.
cookCake 함수는 외부 함수
인 makeCake 안에서 정의되어 있다.
makeCake 함수가 호출될 때마다 cookCake 함수가 만들어진다.
하지만 ingredient 변수는 makeCake 함수가 호출될 때 처음 한 번만 설정된다.
그래서 cookCake 함수가 어디서 호출되든지간에 항상 같은 ingredient 변수를 사용한다.
즉, 함수가 생성될 때의 환경을 기억하고 그 환경에 접근할 수 있게 해준다.
예제 2번
function myFun() {
const a = 10;
function yourFun() {
a = a + 10;
return a;
}
return yourFun;
}
const fn = myFun();
console.log(fn());
함수가 만들어질때, 호출될때가 있는데, 클로저라는 것은 함수가 만들어질때 함수 스코프 안의 코드 안에 있는 접근하는 변수들중에서 본인이 가지고있지 않은 것을 기억한다
(클로저라는 공간을 만들어놓고 a를 넣어놓음)
그래서 yourfun 함수는 a 와 클로저 를 함께 가지고 있다.
(yourfun에는 a만 있고 값은 myfun(바깥)에 있기때문에 본인이 가지고 있지 않은것임)