외부함수가 내부함수를 반환하는 경우,
외부함수를 호출하면 외부함수는 내부함수를 반환하고 실행 컨텍스트 스택에서 제거된다.
하지만 반환된 내부함수는 외부함수에 있는 변수에 접근할 수 있다.
즉,
내부함수가 외부함수보다 더 오래 유지되는 경우,
외부함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근할 수 있는 현상.
이를 클로저라 한다.
1 2 3 4 5 6 7 8 9 10 | function A(){ let hello = "hello"; return funtcion(){ alert(hello); } } let func = A(); func(); // hello 변수에 접근할 수 있다. | cs |
클로저는 반환된 내부함수가 자신이 선언됐을 때 환경인 스코프를 기억하여,
자신이 선언됐을 때의 환경 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수를 말한다.
외부함수가 이미 반환되어도 그 안에 있는 변수는 이를 필요로 하는 내부함수가 하나라도 존재하는 경우 계속 유지된다.
이때 내부함수는 외부함수에 있는 변수의 복사본이 아닌 실제 변수에 접근한다.
이러한 특성을 이용해 Private나 Currying을 구현할 수 있다.
1 2 3 4 5 6 7 8 9 10 | function hello(name){ let _name = name return function{ console.log("hello" + _name); } } hello1 = hello("철수"); hello1(); // hello1은 외부 함수의 변수에 접근할 수 없다. | cs |
'WEB > JS' 카테고리의 다른 글
[JS] 제너레이터 (0) | 2019.01.13 |
---|---|
[JS] 이터러블과 이터레이터 (0) | 2019.01.13 |
[JS] 실행 컨텍스트 (0) | 2019.01.09 |
[JS] this 바인딩 (0) | 2019.01.09 |
[JS] 스코프, 렉시컬 스코프 (0) | 2019.01.09 |