출저
- 코어자바스크립트 - 정재남
어떤 함수에서 선언한 변수를 참조하는 내부함수를 외부로 전달할 경우, 함수의 실행 컨텍스트가 종료된 후에도 해당 변수가 사라지지 않는 현상.
A closure is the combination of a function and the lexical environment within which that functio was declared -MDN-
선언될 당시의 LexicalEnvironment 와의 상호관계
라고 한다.
클로저란 어떤 함수 A 에서 선언한 변수 a를 참조하는 내부함수 B를 외부로 전달할 경우 A의 실행 컨텍스트가 종료된 이휴에도 변수 a가 사라지지 않는 현상
let outer = function () {
let a = 1
let inner = function () {
return ++a
}
return inner
}
let outer2 = outer() // ---(1)
console.log(outer2()) // 2 ---(2)
console.log(outer2()) // 3 ---(3)
클로저가 필요한 경우가 아닌 이상은 의도치 않게 메모리 소모가 발생하기 때문에 관리를 해주는 것이 필요하다.
let outer = (function () {
let a = 1
let inner = function () {
return ++a
}
return inner
})()
console.log(outer())
console.log(outer())
outer = null // outer 식별자의 inner 함수 참조를 끊음
콜백 함수 내부에서 외부변수를 참조하기 위한 방법
1. 클로저를 사용하는 방법
2. bind 메서드를 활용하는 방법
3. 콜백 함수를 고차함수로 바꿔서 클로저를 적극적으로 활용하는 방법
정보 은닉 (information hiding) 은 어떤 모듈의 내부 로직에 대해 외부로의 노출을 최소화해서 모듈간의 결합도를 낮추고 유연성을 높이고자 하는 개념
부분 적용 함수 (partially applied function) 이란 n개의 인자를 받는 함수에 미리 m개의 인자만 넘겨 기억시켰다가, 나중에 (n-m) 개의 인자를 넘기면 비로소 원래 함수의 실행 결과를 얻을 수 있게끔 하는 함수
커링 함수 (currying function) 이란 여러 개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서 순차적으로 호출될 수 있게 체인 형태로 구성한 것