ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Javascript - Closure
    내가 보기 위해 쓰는 것/Javascript 2019. 10. 7. 15:04

    생활코딩에서 쭉 봤는데

     

    거기서 나오는 마지막 예제가 하이라이트 인 것 같다..

     

    내가 쓴 예제를 이해하려면 호이스팅과 IIFE 개념이 필요하다.

     

    Closure의 개념은 내부함수가 외부함수의 변수등에 접근할 수 있다는 것이다.

    block scope의 관점에서 봤을 때 당연해 보이기도 하는데

    중요한건 외부함수가 소멸하거나 호출되지 않은 경우에도 참조 할 수 있다는 것이다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var 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 소멸된 상태에서도 외부함수 영역의 변수에 접근할 수 있는 개념이라고 했지만 위 예제는 그걸 보여주지 못한다.

    클로저가 적용된 예제는 아래처럼 바꾼 코드다.

     

    아래 예제를 읽어보자

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var 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의 개념이라고 이해했다.

    댓글

Designed by Tistory.