<Javascript> 11. Closer
by BFine반응형
Javascript Closer
1. 클로저란
- 변수의 유효 범위를 확장하는 기능이다.
- 간단하게 외부에서 계속 필요로 하는 지역변수를 파괴하지 않고 남겨두는 것이다.
1.1 예시
- 위의 실행결과는 k는 정의되지 않은 함수가 나온다.
- 그 이유는 k의 스코프는 함수 f내에 있기 때문이다.
- 1번은 실행 되지 않는다. 왜냐하면 inner함수는 f함수에 속해 있기때문에 return 하면 이미 f함수는 종료되기 떄문이다.
- 하지만 2번은 5라는 결과가 출력된다. 이것이 클로저 이고 함수가 동작하기 위해 필요한 지역변수를 포괄한 환경을 유지 한다.
- 클로저는 함수 자체를 가르키는 것이 아닌 유지해야하는 실행환경 을 의미한다.
- 여기서 k는 f()가 아닌 f()의 클로저에 소속되는 것이다.
2. 사용하는 곳
- 하나의 예로 이벤트 핸들러를 등록할때 지역변수를 자유롭게 참조할 수 있어야한다.
- 아래의 변수 k를 setInterval 내부에 선언하면 초기화되므로 카운트가 되지 않는다. 전역변수로 쓸수 있으나 좋은 방법이 아니다.
- 클로저를 사용하면 지역변수의 라이프사이클을 전역변수처럼 사용할 수 있게 된다.
- 아래처럼 두개의 f()은 독립적으로 작동하기 때문에 클로저는 재사용성이 좋다.
3. 참고
- 렉시컬환경 이란 함수 또는 블록의 유효범위 안에 있는 식별자와 결과값이 저장되는 곳 을 말한다.
- 이는 환경레코드(값이 바인드 되는 공간)과 외부 렉시컬환경 참조(포인터 같은 역할)로 이루어져있다.
- 예로 f함수 안에 g함수가 있으때 클로저는 f함수의 렉시컬환경과 전역 렉시컬환경 컴포넌트가 클로저가 된다.
- f의 렉시컬환경 안에는 함수g의 식별자와 포인터가 있으며 클로저 안에 함수 g의 함수객체가 존재한다.
- f함수가 호출되어 함수 g가 실행되는 시점에 생성된다. 즉 클로저는 함수객체(g)와 렉시컬 환경컴포넌트의 집합 이다.
- 함수 g의 함수 객체가 있는 한 클로저는 메모리에서 지워지지 않는다.(실행이 끝나도 참조하고 있으면 지워지지않는다.)
- 리터럴로 선언하면 객체 형태로도 사용할 수 있다.
출처
반응형
'공부(2018~2019) - 스킨변경전 > Javascript' 카테고리의 다른 글
<Javascript> 12. Namespace (0) | 2019.05.31 |
---|---|
<Javascript> 10. Promise (0) | 2019.05.27 |
<jQuery> 7. Ajax (0) | 2018.04.25 |
<jQuery> 6. MAP (0) | 2018.04.12 |
<jQuery> 5. Event object (0) | 2018.04.11 |
블로그의 정보
57개월 BackEnd
BFine