on
test
test
네이버 glace 최승락님의 "Javascript Closure는 Private 변수 만드는 용도인가?" 글을 보고 정리한 글입니다.
Closure 자체에 대한 개념은 여기 에 따로 정리한 적 있으니 참고하면 좋을수도
Closure 는 리액트 훅스 등 다양한 용도로 사용될 수 있는 javascript 에서 중요한 특성이다. javascript 는 prototype 기반으로 설계된 언어이기 때문에, 특정 시점에 값을 묶어둘 수 있는 클로저가 더욱 중요하게 여겨지는 것 같기도 하다.
그러나 다른 언어들도 Closure 를 지원한다. (애초에 클로저라는 함수형 프로그래밍 언어에서 비롯된 단어다)
요즘 많이 도입되는 개념인 함수형 프로그래밍과 연관된 명세가 Closure 다.
Closure 의 어떤 특성이 함수형 프로그래밍과 연결되는 걸까? 생각해보자.
아래 예시처럼, Lexical Scope를 메모리에 저장해서 (닫아서) 생명 주기가 끝나버린 변수를 참조하는 것을 클로저라 한다
function outer() { var a = 2; function inner() { // Lexical Environment를 기억한다. console.log(a); } return inner; // 일급 객체이므로 리턴 가능 } var foo = outer(); // inner 할당 foo(); // 2
아래 예시처럼, 특정한 값들을 stack 에서 pop 되지 않고 메모리에 저장되도록 사용할 수 있다.
function makeAdder(x) { return function(y) { return x + y; // 상위 scope의 x를 참조 }; } var add10 = makeAdder(10) // makeAdder가 종료되어 x는 stack에서 pop되었음 console.log(add10(5)) // function(y) 실행. closure 덕분에 x 값 참조 가능
이런 방식으로 마치 인스턴스의 프로퍼티 혹은 메서드처럼 특정한 값을 저장하기 위해 클로저를 사용할 수 있다.
OK 유용하게 쓸수 있을거 같긴 하다. 근데 왜 유독 함수형 프로그래밍에서는 그럼 왜 Closure 가 필수일까? 함수형 프로그래밍의 주요 요소인 HOF(Higher-Order Function)를 구현하기 위해 Closure가 필요하다.
HOF 는 함수를 리턴하는 함수다.
함수를 리턴할 수 있으려면 그 함수가 일급 객체여야 한다.
이 일급 객체는 게으른 평가(lazy excution) 이 이뤄진다. (값이 실제 필요할 때까지 실행되지 않음)
그러기 위해 lexical scope 의 값들을 메모리에 저장할 필요가 생긴다.
from http://seung00.tistory.com/59 by ccl(A) rewrite - 2021-12-26 03:27:44