프론트엔드/자바스크립트

클로저

테오구 2021. 9. 8. 14:46
728x90

Achievement Goals

  • 클로저 함수의 정의와 특징에 대해서 이해할 수 있다
  • 클로저가 갖는 스코프 범위를 이해할 수 있다
  • 클로저를 이용해 유용하게 쓰이는 몇 가지 코딩 패턴을 이해할 수 있다

클로저 함수의 특징(1)

화살표 함수를 이용한 간단한 덧셈 함수

const add = (x, y) => x + y;
add(5, 7);

이 함수를 조금 다른 방식으로 구현해봅시다. 아래와 같이 화살표를 두 번 사용합니다. 앞서 본 코드와는 다르게, 함수의 호출(invocation) 이 두 번 발생합니다.

 

함수의 호출(invocation)이 두 번 발생

const adder = x => y => x + y;
adder(5)(7);
const adder = x => y => x + y;
adder(5)(7);//12

typeof adder(5) // 'function'
adder(5) // y => x + y

adder(5) 의 리턴값이 곧 함수의 형태임을 의미합니다.

// const adder = x => y => x + y

// 위의 코드와 동일하게 작동하는 코드
const adder = function(x){
	return function(y){
    		return x + y;
            	}
}

이를 통해 알아볼 수 있는 첫번째 특징은, 클로저 함수는 "함수를 리턴하는 함수" 라는 점입니다. 함수를 리턴하는 함수가 클로저의 형태를 만듭니다.

 

클로저의 활용

데이터를 보존하는 함수

const adder = function(x){
	return function(y){
    	return x + y;
    }
}

const add = adder(5);

일반적인 함수는, 함수 실행이 끝나고 나면 함수 내부의 변수를 사용할 수 없습니다. 이와 다르게, 클로저는 외부 함수의 실행이 끝나더라도, 외부 함수 내 변수가 메모리 상에 저장됩니다.

 

외부 함수(adder)의 실행이 끝나더라도 외부 함수 내 변수(x)를 사용할 수 있다.

 

const adder = function(x){
	return function(y){
    	return x + y;
    }
}

const add = adder(5);
add(7)//12
add(10)//15

이때의 7과 10은 y의 값에 할당이 된다.

 

보다 실용적인 사용방법은 이렇다.

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

const divMaker = tagMaker('div');
divMaker('hello') // <div>hello</div>
divMaker('code')//<div>code</div>

const anchorMaker = tagMaker('a');
anchorMaker('go')//<a>go</a>
anchorMaker('class')//<a>class</a>

 

클로저 모듈 패턴

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

const counter = makeCounter();

클로저를 이용해 여러개의 내부 함수를 리턴할 수 있습니다.

makeCounter 함수는 increase, decrease, getValue메소드를 포함한 객체 하나를 리턴합니다. 따라서, counter1은 객체입니다.

728x90

'프론트엔드 > 자바스크립트' 카테고리의 다른 글

DOM  (0) 2021.09.10
Spread/Rest 문법  (0) 2021.09.09
스코프  (0) 2021.09.08
원시 자료형(primitive)vs참조 자료형(referense)  (0) 2021.09.08
Promise  (0) 2021.08.28