JavaScript(Closure) 복습

otter·2021년 7월 17일

복습 시리즈

목록 보기
3/4
post-thumbnail
  • 클로저 함수란, 외부 함수의 컨텍스트(변수)에 접근할 수 있는 내부함수를 의미한다.

  • 클로저 함수는 외부함수와 내부함수로 나뉘어진 함수들 사이 내부함수를 의미하는데, 외부함수의 변수에 접근이 가능하고 이를 활용하거나, 변형 시킬 수 있는 함수이다.

  • 클로저는 지역 스코프를 띈다. 클로저 함수는 외부 함수 내에 있는 내부 함수로써 바깥쪽 스코프인 외부함수에 접근할 수 있는 안쪽 스코프 함수이다.

  • 클로저를 이용해 가능한 몇가지 중 캡슐화모듈화라는 것이 있다.

function global (x) {
  return function (y) {
      return x + y
  }
}

global(2)(3)			// 5
let module = global(3)	// 3(x) + y
let module2 = global(5)
module(4)				// 3(x) + 4(y) = 7
module2(4)				// 5(x) + 4(y) = 9

위의 예시가 모듈화다. 같은 함수를 변수에 담아줬음에도 x에 넣어준 값에 따라 다른 역할을 하는 각각의 모듈이 생성된다.

function tagMaker = tag => content =>
`<${tag}>${content}</${tag}>`

let divMaker = tagMaker('div')
divMaker('hello')		// '<div>hello</div>'

위처럼 div 태그를 생성하는 모듈도 만들 수 있다.


그리고 '클로저 모듈 패턴'이라고 하는 아주 유용한 예시가 있다.

const makeCounter = () => {
    let value = 0;
    return {
        increase: () => {
            value = value + 1
        },
        decrease: () => {
            value = value - 1
        },
    	getValue: () => {value}
    }
}

const couter1 = makeCounter();
counter1.increase();	// 1
counter1.increase();	// 2
counter1.increase();	// 3
counter1.getValue();	// 3
const counter2 = makeCounter();
counter2.decrease();	// -1
counter2.decrease();	// -2
counter2.decrease();	// -3
counter2.getValue();	// -3

살펴보자면, makeCounter 안에는 연산만을 담아줬다.

리턴 값으로는 각 연산을 진행할 함수들을 객체에 담아둔 것이다.

이 모듈 패턴의 특징은 한가지가 더 있는데 바로 캡슐화다.

밖에서는 makeCounter 함수의 value 값에 접근할 수 없기 때문에
정보의 접근제한(캡슐화) 상태인 것이다.

캡슐화가 가능한 이유는 value라는 값을 따로 두지 않고,
굳이 makeCounter라는 스코프 역할을 해주는 함수로 감싸줬기 때문에 가능한 것이다.

0개의 댓글