[JavaScript] 클로저(Closure)
클로저는 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 scope를 기억하여 자신이 선언됐을 때의 환경(scope) 밖에서 호출되어도 그 환경(scope)에 접근할 수 있는 함수를 말한다. 이를 조금 더 간단히 말하면 클로저는 자신이 생성될 때의 환경(Lexical environment)을 기억하는 함수라고 말할 수 있다. 일반적으로 외부 함수의 실행이 끝나면 외부 함수가 소멸되어 내부 함수가 외부 함수의 변수에 접근할 수 없다. 하지만 외부 함수의 실행이 끝나고 외부 함수가 소멸된 이후에도 내부 함수가 외부 함수의 변수에 접근할 수 있는 구조를 클로저라고 한다. 즉, 자신의 고유 스코프를 가진 상태로 소멸하지 않고 외부 함수에 의해 호출되는 함수를 만드는 것이 바로 클로저이다. let outerFunc = () => { let x = 10 ; let innerFunc = function () { console . log ( x ); }; return innerFunc ; }; /* * 함수 outerFunc를 호출하면 내부 함수 innerFunc가 반환된다. * 그리고 함수 outerFunc의 실행 컨텍스트는 소멸한다. * 함수는 return하면 생을 마감한다. */ let inner = outerFunc (); inner (); // 10 클로저를 남발하게되면 가비지컬렉션 대상이 되어야할 객체들이 메모리상에 남아있게 되므로 클로저를 남발하면 오버플로우가 발생할 수도 있다. +예시 const add = a => b => a + b ; console . log ( add ( 10 )); // b => a + b const add10 = add ( 10 ); console . log ( add10 ( 10 )); //20 console . log ( add10 ( 40 )); //20 함수를 반환하는 고차함수이다....