-
Javascript - Closure내가 보기 위해 쓰는 것/Javascript 2019. 10. 7. 15:04
생활코딩에서 쭉 봤는데
거기서 나오는 마지막 예제가 하이라이트 인 것 같다..
내가 쓴 예제를 이해하려면 호이스팅과 IIFE 개념이 필요하다.
Closure의 개념은 내부함수가 외부함수의 변수등에 접근할 수 있다는 것이다.
block scope의 관점에서 봤을 때 당연해 보이기도 하는데
중요한건 외부함수가 소멸하거나 호출되지 않은 경우에도 참조 할 수 있다는 것이다.
1234567891011121314var arr;var i;var index;arr = [];for(i = 0; i < 5; i++){arr[i] = function(){return i;}}for(index in arr){console.log(arr[index]());}cs 이 경우는 콘솔에 0, 1, 2, 3, 4 가 나와야 할 것 같지만
실제론 5, 5, 5, 5, 5가 나온다.
그 이유는 arr[i]에 담긴건 함수인데 그 당시의 i를 담은 게 아니라 i를 리턴하라는 함수 그 자체만 담겼기 때문이다.
따라서 arr[index]로 호출했을 때 i는 이미 5로 반복이 끝난 상태 이기 때문에 5가 나온다.
Closure 는 외부함수가 호출되지 않은 or 소멸된 상태에서도 외부함수 영역의 변수에 접근할 수 있는 개념이라고 했지만 위 예제는 그걸 보여주지 못한다.
클로저가 적용된 예제는 아래처럼 바꾼 코드다.
아래 예제를 읽어보자
1234567891011var arr = [];for(var i = 0; i < 5; i++){arr[i] = function(id) {return function(){return id;}}(i);}for(var index in arr) {console.log(arr[index]());}cs 결과는 0, 1, 2, 3, 4 가 나온다.
처음에 나온 예제와 비교하면
arr[i]에 function을 담고있는데 function이 즉시 다른 function을 return 하고 있다. 또한 동시에 호출하고 있다. (이 부분이 이해가지 않는다면 IIFE에 대해서 검색)
즉 처음 호출된 function의 return을 저장하게 된다. (4번라인)
우선 이 시점에서 외부함수, 내부함수의 개념이 충족되었다.
처음 호출된 외부함수는 id라는 이름으로 매개변수를 받고 있다. IIFE로 호출된 바에 따르면 i 값을 매개면수로 받고 있다.
즉 외부함수가 변수또한 가지고 있다.
이제 실질적으로 arr[i] 저장된 내부함수는 id를 return 한다. 하지만 id는 외부함수 영역에 존재한다.
여기까지 보면 외부함수는 매개변수를 전달만 해주고 사라졌다.
아래 for문에서 부르는 arr[index]는 내부함수다.
그러나 외부함수가 소멸했음에도 id의 값을 유지하여 참조한다.
이게 Closure의 개념이라고 이해했다.
'내가 보기 위해 쓰는 것 > Javascript' 카테고리의 다른 글
JavaScript - Prototype & Prototype chain (프로토타입과 프로토타입 체인) (0) 2019.10.24 JavaScript - 쓰로틀링(Throttling) (0) 2019.10.23 Javascript - 호이스팅개념 (0) 2019.10.07 javascript 에서 xml parsing 하기 (0) 2019.09.25 Javascript 객체 선택에 대해 (0) 2019.09.24