ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CS Study] Closure
    네트워크/CS Study 2023. 6. 21. 13:51

    클로저란?

    정의로써는 함수와 함수가 선언된 어휘적 환경의 조합이란다. ????

    그냥 전역스코프에 선언한 변수는 아무대서나 건드릴 수 있으니 아무나 못건드리고 나만 건드릴 수 있게 만들어주는 녀석이다.

    클로져는 상태를 안전하게 활용하기 위해서 사용되어야 한다 === 의도치 않은 변경은 막아야지

     


    써야하는 이유? 

    그래서 왜 아무나 건드리면 안되는데? 라고 물어보면 다음과 같은 상황을 볼 수있다.

    var x = 1;
    var y = 1;
    function sumOne() {
    	return x++
    }
    
    function ySum() {
        
        return y++, x++
    }
    sumOne()
    console.log(x) // x = 2
    sumOne()
    ySum()
    x++
    console.log(x) // x = 5

    나는 sumOne()를 통해서만 x의 값에 변화를 주고 싶은데 이 x는 전역스코프에 위치해 있기 때문에 쓸데없는 ySum()에서도 건드릴 수 있고 전역스코프에서도 건드릴 수 있는 총체적난국이 되어버리는 것이다.

     

    이러한 현상을 막기 위해(정보를 나만쓰게 은닉하기 위해) 클로져가 사용 된다. 


    예시를 통해 보는 클로져

    var outer = function() {
        var a = 1
        var b = 'rula'
        var inner = function() {
        	return ++a;
            };
        return inner
    };
    var outer2 = outer();

     

    위의 로직에서 a와 b의 차이에 대해서 알아보겠다.

    outer함수의 실행컨텍스트가 종료되면서 return 값이 전달되어야하는데 이 return 값이 outer의 실행컨텍스트 전에 종료되고 나가버린 inner()이다. 그렇다보니 외부함수(outer)가 중첩함수(inner) 보다 먼저 끝나버린 상황이 되었다. 그러면서 inner()함수가 실행될 때 필요한 outer에서 생성된 a라는 녀석을 불러오게 되는데 생명주기가 종료한 외부함수의 변수를 참조하는 상황 이게 클로져인것이다. 그럼 같이 있던 b는??? inner에서 참조하지 않기 때문에(참조카우트가 0이다) 가비지컬렉터가 가져가버린다...


    이녀석이 클로져가 아닌 이유는 무엇일까???? return 값으로 inner이 오지 않기 때문에 순차적으로 일어나는 중첩함수이기 때문이다 === 아무때나 일어나는 것이 아니라 return 값을 봐라   

    fucntion outet() {
        const x = 1;
        function inner() {
        	console.log(x);
        };
        inner();
    };
    outer();

     

     

     

     

     

     

     

    댓글

Designed by Tistory.