일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 27 | 28 | 29 | 30 | 31 |
Tags
- 클린코드
- 이벤트위임
- 1931번문제
- 이펙티브타입스크립트
- 개발자필독서?
- 2월기념일을위해서달리자
- 취업준비중..
- 프론트엔드 개발을 위한 자바스크립트 (feat. VanillaJS)
- 실용주의프로그래머
- 북클럽
- 노마드코더
- 실용주의프로그래밍
- 개발자필독서
- JS비동기처리
- 그리디알고리즘
- 자바스크립트스터디
- 이벤트위임예제
- 노마드북클럽
- JavaScript
- 코딩
- CSS
- 프로그래머스
- 캐럿마켓클론
- 개발자
- 백준문제풀이
- 노개북
- 취업준비중
- 시작
- 리액트의탄생
- 11399번문제
Archives
- Today
- Total
파카
클로저, 생성기 함수란 ? 본문
함수란 계산이나 처리를 위한 코드의 묶음이다.
일반적으로 함수는 해당 함수가 다 처리가 되면 함수가 종료가 된다.
이런 함수를 조금 독특하게 사용할 수 있는 방법 중에 하나가 클로져다.
// 일반적인 함수
let saveNumber = 1;
function increment() {
return saveNumber++;
}
console.log(increment());
console.log(increment());
saveNumber = 200;
console.log(increment());
// saveNumber에 접근이 가능해서 값을 임의로 접근하여 변경할 수 있는 문제가 있다.
이런 문제상황에서 특정한 데이터를 보호하고 싶을 때 클로저를 사용할 수 있다.
// 클로저는 함수 안쪽에서 함수가 만들어질 때
// 함수 안쪽에 있는 코드중에 바깥 함수에 있는 변수에 접근을 하게 되면,
// 접근한 변수를 클로저라고 하는 특별한 공간에 저장을 해둔다.
// 디버깅을 통해 Closure 공간을 확인해보자.
function incrementClosure() {
let saveNumberClosure = 1;
return function() {
return saveNumberClosure++
}
}
const inc = incrementClosure();
console.log(inc());
console.log(inc());
console.log(inc());
// 어떤 상황에 쓰일까?
// 클로저 공간은 코드상에서 함수 밖에서 접근할 수 없다. 보호가능
// 타입스크립트에서는 class 를 만들 때 private으로 보호할 수 있다.
그렇다면 생성기 함수란 무엇일까 ?
생성기 함수 (Generator Function)
다른 모든 함수는 값을 반환하면 함수가 종료가 되지만 제너레이터는 값을 반환 후 종료가 되지 않도록 할 수 있다.
생성기 함수가 이용되는 예제를 코딩해보자
// 먼저 일반적인 함수
function makeInfiniteEnergyGenerator() {
let energy = 0;
return function (booster = 0) {
if (booster) {
energy += booster;
} else {
energy++;
}
return energy;
}
}
const energy = makeInfiniteEnergyGenerator();
// console.log(energy);
// for (let i = 0; i < 5; i++) {
// console.log(energy());
// }
console.log(energy(5));
// 아래는 제너레이터 함수이다.
// 제너레이터 함수는 실제 콘솔로그를 통해 동작을 보면 더 이해하기가 좋은거 같다.
function* infiniteEnergyGenerator() {
let energy = 1;
while (true) {
// yield : 제너레이터 함수를 정지시킨다.
// 뒤에 쓰인 값을 호출자에게 반환해준다.
const booster = yield energy;
if (booster) {
energy += booster;
} else {
energy++;
}
}
return;
}
// 제너레이터 함수는 선언시에 함수가 실행되지 않고
// 실행시키는데 필요한 도구를 객체에 담아서 전달
// ex) next : 제너레이터 함수 실행을 재개시킨다
const energyGenerator = infiniteEnergyGenerator();
console.log(energyGenerator);
for (let i = 0; i < 5; i++) {
console.log(energyGenerator.next());
}
console.log(energyGenerator.next(5));
코드를 보고 동작에 대한 이해는 되긴 해도 아직 활용되는 예까지는 잘 떠오르지 않는다..
서칭을 통해 더 찾아봐야 좋을 거 같다..
참고
: https://ko.javascript.info/closure
변수의 유효범위와 클로저
ko.javascript.info
'프로그래밍 > Javascript' 카테고리의 다른 글
이벤트 시스템, 이벤트 위임 (0) | 2021.12.29 |
---|---|
JS, aync, await (0) | 2021.12.11 |
JS, promise (0) | 2021.12.10 |
JS, 비동기 처리와 콜백함수 (0) | 2021.12.09 |
일급함수, 일급객체란 ? (0) | 2021.12.08 |
Comments