JavaScript 강의

5-5 클로저

kagan-draca 2024. 8. 18. 21:20

클로저 개념 : 함수와 렉시컬 환경과의 조합

return function()

{

}

이나

const 함수명 = fuction()

{

 

}

return 함수명

으로 함수를 리턴 시켜주기

 

 

 

출력값 x는 무엇인가?

 

1. inner 함수 내부에서 x가 선언 및 초기화가 있는지 찾아본다.

2. inner함수(구현부분) 외부 함수가 존재하는지 보고 있으면

그 함수 내부에 x가 선언 및 초기화 되는지 찾는다.

3. 외부 함수에도 없다면 전역에

x가 선언 및 초기화 되는지 찾는다.

 

x : 10

 

동일한 방법으로

 

출력값 x는 무엇인가?

 

 

예상
10
실제
1

 

x가 1인 이유는

 

innerFunc()함수 '호출'이 outerFunc() 함수

내부에 있다고 함수 '정의' 부분이

outerFunc() 내부에 있는게 아니다!!!

( innerFunc와 outerFunc는 서로 다른 scope를 가진다 )

(함수를 어디에 '정의' 했는지에 따라서 상위 scope가 결정된다)

 

 

클로저와 렉시컬 환경

- 외부 함수보다 중첩 함수가 더 오래 유지되는 경우,

중첩 함수는 이미 생명 주기가 종료한

외부 함수의 변수여전히 참조할 수 있다.

위의 소스코드로 설명해보면

 

const innerFunc = outer()로

outer 함수의 실행 및 return 부분을

innerFunc에 담는다.

 

변경 후
위와 같이 innerFunc 안에 x 변수의 선언과 값이 없더라도
outer 함수의 const x = 10이 살아남아
console.log(x)로 10이 출력된다.


=> 클로저의 개념
x
10

 

 

문제 1

 

출력 값은

예상
3
실제
3

 

 

문제 2

출력 값은

예상
1
실제
1

 

 

문제 3

예상
1
실제
1

 

클로저 활용

 

1. 의도치 않은 변경은 방지하면서 + 이전 상태 유지하기

 

위와 같은 코드의 경우 

num이 100으로 변경 돼

101, 102가 출력되는걸 볼 수 있다.

 

그래서 let num을 지역 변수로 바꿔주면

 

num이 increase함수 호출에 따른

생성 및 초기화가 반복 돼

1

1

1

이 출력되는걸 볼 수 있다.

 

의도치 않은 변경은 방지하면서 + 이전 상태 유지하기

하기 위해서 클로저(return 함수)를 활용하면

 

클로저를 활용하면

 

위와 같이 지역 변수 num이 가비지 콜랙션에 의해

사라지지 않고, 값을 유지해

 

1

2

3

 

출력 되는걸 볼 수 있다.

 

의도치 않은 변경은 방지하면서 + 이전 상태 유지할 수 있었다!

'JavaScript 강의' 카테고리의 다른 글

5-4 Static(정적) Method(메서드)  (0) 2024.08.18
5-3 상속  (0) 2024.08.18
5-2 Class  (0) 2024.08.18
5-1 DOM  (0) 2024.08.18
4-1 콜백 함수의 기본 개념  (0) 2024.08.14