상세 컨텐츠

본문 제목

클로저 비용

Front-End/Javascript

by devloper-jun 2024. 9. 19. 14:21

본문

- 클로저는 생성될 때마다 선언적 환경을 기억해야 하므로 추가적인 비용이 발생한다. 

/* 클로저와 그것에 따르는 비용을 확인하는 예제 */

// 일반적인 함수
const a = document.getElement('a')
function job() {
	const arr = Array.from({length: 10000000}, (_, i) => i+1)
    console.log(arr.length)
}
a.addEventListener('click', job)

// 클로저 함수
function jobWithClosure() {
	const arr = Array.from({length: 10000000}, (_, i) => i+1)
    return function() {
    	console.log(arr.length)
    }
}
const innerFunc = jobWithClosure()
b.addEventListener('click', function() {
	innerFunc()
})

 

- 두개의 함수를 개발자 도구에서 확인해보면 클로저를 활용하는 쪽이 압도적으로 부정적인 영향을 미친다.

- 클로저 jobWithClosure()로 분리해 실행하고 이를 onClick에 실행하는 방식인데 이미 스크립트를 실행하는 시점부터 아주 큰 배열을 메모리에 올려두고 시작하며, 클로저의 기본 원리에 따라서 클로저가 선언된 순간 내부 함수는 외부 함수의 선언적인 환경을 기억하고 있어야 하므로 이를 어디서 사용하는지의 여부와 상관 없이 저장해 놓는다.

- onClick 내부에서만 jobWithClosure()를 사용하고 있지만 이를 알 수 있는 방법이 없기 때문에 긴 배열을 저장해 두고 있으며, 일반 함수의 경우에는 클릭 시 스크립트 실행이 조금 길지만 클릭과 동시에 선언, 길이를 구하는 작업이 스코프 내부에서 끝났기 때문에 메모리 용량에 영향을 미치지 않는다.

- 외부 함수를 기억하고 이를 내부 함수에서 가져다 쓰는 메커니즘은 성능에 악영향을 미치며, 클로저에 꼭 필요한 작업만 남겨두지 않는다면 메모리를 불필요하게 사용하는 결과를 야기, 클로저 사용을 적절한 스코프에 선언하지 않는다면 성능에 악영향을 미침.

 

'Front-End > Javascript' 카테고리의 다른 글

(2) 이벤트 루프  (0) 2024.09.19
(1) 싱글 스레드와 비동기 통신  (0) 2024.09.19
함수 레벨 스코프와 블록 레벨 스코프의 비교와 클로저  (0) 2024.09.19
클로저  (0) 2024.04.22
클래스와 함수의 관계  (0) 2024.04.21

관련글 더보기