클로저(closure)는 함수형 프로그래밍 언어에서 사용되는 중요한 특성이다. 클로저를 정의해보면 다음과 같습니다.
외부 함수에 접근할 수 있는 내부 함수(이러한 원리)를 일컫는 용어로, 스코프 범위 개념에 따라 내부함수의 범위에서는 외부함수 범위에 있는 변수에 접근이 가능하지만, 그 반대는 실현이 불가능한 개념입니다.
# 클로저의 유용한 활용
*커링 이용: 함수 하나가 n개의 인자를 받는 대신, n개의 함수를 만들어 각각 인자를 받게하는 방법
1
2
3
4
5
6
7
8
9
10
11
12
|
function add(a){
return function(b){
return a + b;
}
}
let result = add(4)(6);
console.log(result); // 10
let result100 = add(100);
console.log(result100(10)); // 110
console.log(result100(20)); // 120
|
cs |
▲ a값을 100으로 고정해놓은 후 재사용이 가능하다.
*캡슐화 이용: 변수를 스코프 안쪽에 가두어 함수 밖으로 노출시키지 않는 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
function bank(money){
return{
getMoney : function() {
return money;
},
setMoney : function(_money) {
if(typeof _money === "number"){
money = _money
} else{
console.log("잘못된 값을 입력하셨습니다.");
}
}
}
}
let person1 = bank(3000);
let person2 = bank(4000);
console.log(person1.getMoney()); // 3000
console.log(person2.getMoney()); // 4000
person1.setMoney("1000"); // "잘못된 값을 입력하셨습니다."
person2.setMoney(2000);
console.log(person1.getMoney()); // 3000
console.log(person2.getMoney()); // 2000
|
cs |
▲ Private속성을 통해 객체의 내부에서만 사용해야되는 값이 노출됨으로서 생길 수 있는 오류를 줄일 수 있다.
*템플릿 함수 이용 : html 태그 만들기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function htmlMaker(tag){
let startTag = '<' + tag + '>';
let endTag = '</' + tag + '>';
return function(content){
return startTag + content + endTag;
}
}
let divMaker = htmlMaker('div');
console.log(divMaker('title')); // <div>title</div>
console.log(divMaker('content')); // <div>content</div>
let spanMaker = htmlMaker('span');
console.log(spanMaker('list')); // <span>list</span>
|
cs |
▲ 외부 함수의 변수가 저장되어 마치 템플릿 함수와 같이 사용이 가능하다.
'Web[웹] > 자바스크립트' 카테고리의 다른 글
DOM 다루기 (Document Object Model) (0) | 2020.07.04 |
---|---|
전역객체 Window와 BOM, DOM의 정의 (0) | 2020.07.04 |
스코프 (Scope) | var과 let, const의 차이점 (0) | 2020.06.25 |
Array 메서드 | #2-2 Immutable (불변성) 메서드 (0) | 2020.06.21 |
Array 메서드 | #2-1 Immutable (불변성) 메서드 (0) | 2020.06.21 |