-
[자바스크립트] 클로저에 대해서javascript 2021. 4. 9. 14:34반응형
(정의)
클로저는 함수와 그 함수가 선언됐을 때의 렉시컬 환경(Lexical environment)과의 조합이다.
렉시컬 환경 : 스크립트 전체, 실행중인 함수, 코드블록 등은 자신만의 렉시컬 환경을 갖는다. 렉시컬 환경은 환경레코드, 외부렉시컬 환경으로 구성된다.
(사전지식)
함수는 3가지정보가 포함된 객체를 갖는다(추상적개념임)
1. 변수에대한정보(활성객체 AO(activation object))
2. 스코프체인
3. this(는 호출되는 환경에 의해정해짐)
(설명)
스코프는 함수를 호출할 때가 아니라 함수를 어디에 선언하였는지에 따라 결정된다. 이를 렉시컬 스코핑(Lexical scoping)라 한다. 위 예제의 함수 innerFunc는 함수 outerFunc의 내부에서 선언되었기 때문에 함수 innerFunc의 상위 스코프는 함수 outerFunc이다. 함수 innerFunc가 전역에 선언되었다면 함수 innerFunc의 상위 스코프는 전역 스코프가 된다.
즉. innerfunction 의 렉시컬 스코프(전역, 함수 outerFunc, 자신의 스코프)를 참조할 수 있다.
그런데 스코프 체인은 전역 스코프를 가리키는 전역 객체와 함수 outerFunc의 스코프를 가리키는 함수 outerFunc의 활성 객체(Activation object) 그리고 함수 자신의 스코프를 가리키는 활성 객체를 순차적으로 바인딩한다
바인딩 하는 순서에 따라 안쪽것이 중복시 덮어쓰여진다 그렇기 때문에 나도 가지고 있고 밖에도 가지고 있으면 안에 있는 변수가 우선순위가 높은 것처럼 작동하게 된다.
(활용성)
내부함수에서 외부함수의 변수에 접근 할수 있다라는 클로저의 특징을 어떻게 사용할수 있을까?
1. 상태유지
> 변수에 즉시실행함수(외부함수) 를 할당하고 외부함수 안에 변수로 사용할 값을 저장을 해두고 리턴값으로 내부함수를 사용하면 내부함수는 이미 소멸된 외부함수 의 변수에 접근해서 사용할수 있게된다. 그러나 외부에서는 접근할수가 없기 때문에 그상태는 독립적으로 유지되고 관리 할수 있게된다.
2. 전역변수사용의 억제
> 반환된 함수는 자신만의 독립된 렉시컬 환경을 갖는다. 이는 함수를 호출하면 그때마다 새로운 렉시컬 환경이 생성되기 때문이다. 각각 자신만의 독립된 렉시컬 환경을 갖기 때문에 외부함수의 변수 를 공유하지 않아 변화가 연동되지 않는다.
3. 정보의 은닉
> 소멸된 함수에서 그함수안의 변수에 접근할수 있는것은 소멸된 함수의 내부에 있던 함수들 뿐이다.
'javascript' 카테고리의 다른 글
[자바스크립트] 이벤트 루프에 대해서 (0) 2021.04.26 [javascript] promise 에 대하여 (0) 2021.04.23 [자바스크립트] this 에 대해서 (call,apply,bind) (0) 2021.04.13 자바스크립트 실행컨텍스트에 대하여 ( Excution context) (1) 2021.04.08 Event bubbling , Event capture , Event delegation (2) 2021.04.07