오늘 교육기관 합류를 위한 레벨테스트를 봤는데 생각보다 CS 지식 부분에서 순간순간 막히는 부분이 있었던 것 같다
문제를 풀어보며 기초적인 지식과 javscript의 딥다이브가 많이 부족하구나 느꼈는데
closure가 머릿속에서 아예 없었다는 게 아쉬웠다
이전에 한번 til로 다뤘지만 추가적인 부분이 있으면 좋을 것 같다
먼저 장점부터 살펴보자
함수와 함수가 선언된 어휘적(lexical)환경의 조합
클로저의 핵심은 스코프를 이용해서, 변수의 접근 범위를 닫는(폐쇄)것에 있다
함수가 호출되는 환경과 별개로, 기존에 선언되어 있던 환경(어휘적 환경)을 기준으로 변수를 조회한다
**상위 스코프의 식별자를 포함하여 쓰여있는 내부 함수 코드 자체를 어휘적 환경(lexical environment)라고 부를 수 있다
클로저는 내부 함수가 외부 함수의 맥락(context)에 접근할 수 있는 것을 가리킨다?
그래도 잘 이해가 안되는데 예시를 봐보자
// 클로저를 만드는 형태 1. - 중첩함수
function outerFn() {
let x = 10;
return function innerFn(y) { // innerFn 함수는 클로저다.
return x = x + y;
}
}
let a = outerFn(); // 외부함수 호출은 한번만. 이제 a 변수는 innerFn 함수를 참조한다.
a(5); // 15;
a(5); // 20;
a(5); // 25;
// 클로저를 만드는 형태 2. - 전역에 선언한 변수를 박스 안에서 함수로 정의하고 전역에서 호출
let globalFunc;
{
let x = 10;
globalFunc = function(y) { // globalFunc 함수는 클로저다.
return x = x + y;
}
}
globalFunc(5); // 15;
globalFunc(5); // 20;
globalFunc(5); // 25;
예시를 보며 코드 흐름을 따라갔더니 드디어 이해가 됐다.
클로저는 함수를 리턴하는 함수?
(function () {
var count = 0;
var button = document.createElement("button");
button.innerText ="click";
button.addEventListener("click", function() {
console.log(++count, "times clicked")
})
document.body.appendChild(button)
})();
// 별도의 외부객체인 DOM의 메서드(addEventListener)에 등록할 handler함수 내부에서 지역변수를 참조!
지역 변수를 참조하는 내부 함수를 외부에 전달했기에 클로저는 맞지만,"외부로 전달"이 항상 return을 의미하는 것은 아니다라고 생각하자
클로저는 외부함수와 내부함수에 의해서 스코프가 분리된다?
Reference