diff --git "a/docs/24_\355\201\264\353\241\234\354\240\200/\352\263\240\354\204\270\354\242\205.md" "b/docs/24_\355\201\264\353\241\234\354\240\200/\352\263\240\354\204\270\354\242\205.md" index 93baa974..f73d4f77 100644 --- "a/docs/24_\355\201\264\353\241\234\354\240\200/\352\263\240\354\204\270\354\242\205.md" +++ "b/docs/24_\355\201\264\353\241\234\354\240\200/\352\263\240\354\204\270\354\242\205.md" @@ -90,38 +90,3 @@ const bar = foo(); 이럴 경우 대부분의 브라우저는 최적화를 통해 상위 스코프의 식별자 중 클로저가 참조하고 있는 식별자인 x만 기억한다.
여기서 참조되는 상위 스코프의 변수 x를 **자유 변수**라고 한다. - -### 클로저의 활용 - -클로저는 상태를 안전하게 변경하고 유지하기 위해 사용한다.
-즉, 상태를 안전하게 은닉 하고 특정 함수에게만 상태 변경을 허용하기 위해서 사용한다. - -```javascript -const increase = (function () { - let num = 0; - - return function () { - return ++num; - }; -})(); - -console.log(increase()); //1 -console.log(increase()); //2 -console.log(increase()); //3 -``` - -위 예제에서 볼 수 있듯이 클로저는 `num`을 지역변수로 사용해 상태가 의도치 않게 변경되지 않도록 안전하게 은닉하고, 특정 함수에게만 상태 변경을 허용하여 상태를 안전하게 변경하고 유지하기 위해 사용된다. - -여기서 상태가 의도치 않게 변경되지 않도록 안전하게 은닉한다는 것은 **캡슐화**라는 용어로 대체할 수 있다.
-캡슐화란 객체의 상태를 나타내는 프로퍼티와 프로퍼티를 참조하고 조작할 수 있는 동작인 메서드를 하나로 묶는 것을 말한다. - -클로저를 이용해 캡슐화와 정보은닉을 비슷하게 흉내낼 수 있지만 자바스크립트의 한계로인해 완전한 캡슐화를 진행하기란 어렵다. - -> 현재는 클래스와 `private`가 제공된다. - -`var`키워드를 사용한다면 예상치 못한 실행 결과가 발생할 수 있다. 따라서 되도록 `let, const` 키워드를 사용하자.
-그 이유는 `var`키워드를 사용해 선언된 변수들은 블록 레벨 스코프가 아닌 함수레벨 스코프를 갖기 때문에 전역 변수가 된다. - -하지만 `let, const` 키워드를 사용해 선언된 변수들은 매번 블록 레벨 스코프를 생성하며, 블록을 반복 실행할 때마다 새로운 렉시컬 환경을 생성해, 반복 당시의 상태를 스냅숏을 찍는 것처럼 저장한다. - -추가로 이보다 깔끔한 방법으로는 고차함수들을 사용하는 방법이 있다.