일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JS
- next-pwa
- Redux
- SSR
- csr
- JavaScript
- react-query
- Next
- 달리기경주
- 자바스크립트
- todolist
- 넥스트
- lifecycle
- React
- google firebase
- 리액트
- 배열
- NextJS
- 리엑트
- Recoil
- useMutation
- 생명주기
- 투두리스트
- 파이어베이스
- 리덕스
- 겹치는 선분의 길이
- Firebase
- customModal component 만들기
- debounce
- programmers
- Today
- Total
끄적끄적
[Javascript] 클로저(Closure) 본문
Javascript(JS)에서 중요한 개념인 Closure를 알아보겠습니다.
JS를 사용해본 사람이라면 언젠가 들어봤을겁니다. 클로저. 하지만 개념이 어렵고 낯설어 이해하기가 쉽지 않습니다.
지금부터 closure의 개념과 간단한 예제를 통해 왜! 사용하는지에 대해서 알아보겠습니다.
! 클로저(Closure)란?
Javascript에만 국한되는 것이 아닌 일급객체를 다루는 함수형 프로그래밍 언어에서 사용하는 개념으로,
함수가 실행될 때 의 스코프(lexical scope)를 기억해 함수가 외부에서 사용됐을 때도 이를 기억해 사용할 수 있게 해주는 것이다.
이렇게만 들으면 매우 어렵습니다.
간단하게 전역변수를 지역변수처럼 사용할 수 있게 해주는 것입니다.
이렇게도 들어도 매우 어렵습니다. :( 코드로 살펴보겠습니다.
! 지역변수 vs 전역변수
클로저를 이해하려면 지역과 전역에 대한 이해부터 필요합니다.
여기서 지역 혹은 전역이 스코프를 의미하는 것이고 코드를 보겠습니다.
let a = 1; //전역변수
function f1(){
let b = 2; //지역변수
console.log(a); // output : 1;
console.log(b); // output : 2;
}
console.log(a); // output : 1;
console.log(b); // output : b is not defined;
a는 가장 밖의 함수인 (main과 같은) {}안에 존재하는 전역변수로 선언이 되었고,
b는 f1의 {}안의 scope에 해당하는 f1만의 전역변수 (즉, 지역변수)로 이용이 됩니다.
따라서 b를 f1밖에서 이용하려고하면 존재하지 않는 변수라고 나오게 되는거죠.
! 클로저(Closure)
let Click = () => {
let counter = 0; //자유변수
let up = () => {
counter++;
console.log(counter);
}
return up;
};
let a = Click(); // a는 Click 실행 후 return으로 up 함수를 받습니다.
a(); // output : 1
a(); // output : 2
Click이라는 함수 안에 counter라는 지역변수가 있습니다.
up 함수는 그 counter를 1만큼 증가시킨후 console을 찍는 함수입니다.
이제 밖에 a에 Click()을 넣으면 Click함수가 return한 up함수가 되고,
그 안엔 이들만의 공간이 생기며, 이 환경을 기억하고 counter라는 자신만의 공간의 변수를 이용할 수 있습니다.
let Click = () => {
let counter = 0; //자유변수
let up = () => {
counter++;
console.log(counter);
}
return up;
};
let a = Click();
a(); // output : 1
a(); // output : 2
let b = Click();
b(); // output : 1
b에도 똑같이 Click()을 넣어주면 b는 또 그만의 공간이 생기고, 그 환경을 기억해 b의 counter를 갖습니다.
따라서 a와 b는 각각 그들의 공간의 counter를 갖게 되는 것이죠.
이렇게 closure를 이용하면 객체지향 프로그래밍의 캡슐화, 정보은닉의 효과(private 처럼)를 가질 수 있습니다.
이제 a와 b의 각 counter는 a()와 b()의 호출만을 통해서 안전하게 보관되고 증가될 수 있게 됩니다.
'Javascript' 카테고리의 다른 글
프로그래머스) 달리기경주 javascript (0) | 2023.07.10 |
---|---|
[javascript / react] throttle vs debounce (0) | 2022.05.07 |
[Javascript] reduce 의 간단한 예시 (0) | 2020.12.15 |
[Javascript]Web Storage(Cookie, Local, Session) (3) | 2020.11.30 |
[Javascript/JS] 자바스크립트에서의 배열과 시간복잡도 (2) | 2020.11.25 |