일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 얕은 복사
- 자바스크립트
- 이벤트 버블링
- 세션 스토리지
- polyfill
- 리액트의 생명 주기
- react
- 깊은 복사
- CSS
- 주소창에 naver 입력시 일어나는 일
- undeclared
- 이벤트 캡처링
- webpack
- async/await
- props와 state 차이점
- 클라이언트 사이드 렌더링
- MPA
- 가상 dom
- 실행 컨텍스트
- 프로미스
- 브라우저 렌더링원리
- 서버 사이드 렌더링
- 자바스크립트 함수
- 변수 생성 단계
- 리액트
- 스코프 체인
- CORS
- 호이스팅
- 로컬 스토리지
- 자바스크립트의 클래스
Archives
- Today
- Total
Gapus Dev Blog
[자바스크립트] 클로저 본문
- 클로저란?
- 함수와 함수가 선언된 렉시컬 환경의 조합으로 함수가 선언될 당시의 스코프 체인을 기억하고,
함수가 호출될 때에도 그 스코프 체인을 참조하여 변수에 접근할 수 있게 해준다.
- 함수와 함수가 선언된 렉시컬 환경의 조합으로 함수가 선언될 당시의 스코프 체인을 기억하고,
- 동작 원리
- 함수가 선언될 때, 해당 함수의 렉시컬 환경이 생성된다.
이 렉시컬 환경에는 함수 내부에서 선언된 변수들과 그 값을 담고 있는 스코프 체인이 포함된다. - 클로저는 외부 함수의 변수에 접근할 수 있다. 이는 내부 함수가 외부 함수의 변수를 계속해서 참조할 수 있게 해준다.
- 함수가 반환되거나 다른 함수에 전달될 때, 클로저가 형성된다.
- 함수가 선언될 때, 해당 함수의 렉시컬 환경이 생성된다.
- 예시
function outerFunction() {
var outerVariable = 'Outer';
return function innerFunction() {
console.log(outerVariable);
}
}
var closure = outerFunction();
closure(); // "Outer" 출력
- 사용하는 곳
- 비동기 처리
- 비동기 콜백 함수 내부에서 외부 변수에 접근해야 할 때 클로저를 활용하여,
이를 통해 비동기 작업이 완료된 후에도 원하는 변수에 접근 가능하다.
- 비동기 콜백 함수 내부에서 외부 변수에 접근해야 할 때 클로저를 활용하여,
- 정보 은닉
- 외부에서 접근하지 않아야 하는 변수를 클로저 내부에 선언하고,
클로저를 통해서만 해당 변수에 접근할 수 있도록 제어할 수 있다.
- 외부에서 접근하지 않아야 하는 변수를 클로저 내부에 선언하고,
- 함수 팩토리
- 함수를 동적으로 생성하는 함수 팩토리를 구현해서
매번 새로운 클로저를 생성하여 각각의 인스턴스가 독립적인 상태를 유지 할 수 있다.
- 함수를 동적으로 생성하는 함수 팩토리를 구현해서
- 비동기 처리
- 주의할 점
- 메모리 관리
- 클로저는 JS의 가비지 컬렉터에 의해 메모리에서 해제되지 않는 경우가 있습니다.
- 클로저가 더 이상 필요하지 않은 경우 해당 클로저에 대한 참조를 제거하여 메모리 누수를 방지해야 한다.
- 이를 위해 변수나 객체 등에 대한 참조를 null로 설정하거나,
이벤트 핸들러 등록 해제 등의 작업을 수행해야 한다.
- 성능 고려
- 클로저를 생성할 때마다 메모리에 새로운 렉시컬 환경이 생성된다.
- 클로저를 과도하게 사용하면 메모리 사용량이 증가하고 성능이 저하될 수 있다.
- 비동기 처리시 문제
- 비동기 콜백 함수 내부에서 외부 변수에 접근하는 경우,
클로저를 통해 접근하는 변수의 값은 비동기 작업이 완료되기 전까지 변경되지 않는다.
- 비동기 콜백 함수 내부에서 외부 변수에 접근하는 경우,
- 정보 은닉의 잘못된 사용
- 과도한 정보 은닉은 코드의 가독성을 저하시킬 수 있다.
- 메모리 관리
'프론트엔드 > JavaScript' 카테고리의 다른 글
[자바스크립트] 비동기 처리(콜백, 프로미스 , anync/await) (0) | 2023.10.30 |
---|---|
[자바스크립트] 실행 컨텍스트 (1) | 2023.10.29 |
[자바스크립트] null, undefined, undeclared, NaN (0) | 2023.10.22 |
[자바스크립트] var, let, const 차이점 (0) | 2023.10.22 |
[자바스크립트] 호이스팅 (0) | 2023.10.19 |