클로저는 자바스크립트 고유의 개념이 아니다. 함수를 일급 객체로 취급하는 함숭여 프로그래밍 언어(Haskell, Lisp, Erlng, Scala 등)에서 사용되는 중요한 특성이다.
function foo() {
const x = 1;
const y = 2;
// 클로저
// 중첩 함수 bar는 외부 함수보다 더 오래 유지되며 상위 스코프의 식별자를 참조한다.
function bar() {
debugger;
console.log(x);
}
return bar;
}
const bar = foo();
bar();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 함수를 인수로 전달받고 함수를 반환하는 고차 함수
// 이 함수는 카운트 상태를 유지하기 위한 자유 변수 counter를 기억하는 클로저를 반환한다.
function makerCounter(predicate) {
// 카운트 상태를 유지하기 위한 자유 변수
let counter = 0;
// 클로저를 반환
return function () {
// 인수로 전달받은 보조 함수에 상태 변경을 위임한다.
counter = predicate(counter);
return counter;
};
}
// 보조 함수
function increase(n) {
return ++n;
}
//보조 함수
function decrease(n) {
return --n;
}
// 함수를 함수로 생성한다.
// makerCounter 함수는 보조 함수를 인수로 전달받아 함수로 반환한다.
const increaser = makerCounter(increase);
console.log(increaser());
console.log(increaser());
// increaser 함수와는 별개의 독립된 렉시컬 환경을 갖기 때문에 카운터 상태가 연동하지 않는다.
const decreaser = makerCounter(decrease);
console.log(decreaser());
console.log(decreaser());
console.log(decreaser());
console.log(decreaser());
console.log(decreaser());
console.log(decreaser());
console.log(increaser());
console.log(increaser());
</script>
</body>
</html>
위 글은 위키북스의 모던 자바스크립트 Deep Dive 를 읽고 정리한 내용입니다.