갈푸라떼
갈푸라떼는 개발중
갈푸라떼
전체 방문자
오늘
어제
  • 분류 전체보기 (232)
    • CS (0)
      • CSinfo (0)
    • Frontend (15)
      • HTML,CSS (1)
      • Javascript (2)
      • React (0)
      • React Hook (12)
    • Backend (0)
      • Python (0)
      • Node.js (0)
      • php (0)
    • DB (2)
      • MySQL (2)
      • BigQuery (0)
      • Mongodb (0)
    • Study (186)
      • JavaScript (72)
      • JavaScript(Clean code) (50)
      • Node.js (11)
      • HTML,CSS (13)
      • React (30)
      • TypeScript (10)
      • React-Native (0)
    • Error (2)
      • error (2)
    • Git (22)
      • Git (22)
    • Help Coding (4)
      • Useful websites (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • Github

공지사항

인기 글

태그

  • 인터프리터
  • 프로토타입
  • Babel
  • 상속
  • 실행 컨텍스트
  • 원시타입
  • 스코프 체인
  • ECMAScript
  • structure
  • symbol
  • prototype
  • 컴파일러
  • 자바스크립트엔진
  • this
  • 정적 레벨
  • 함수
  • Arrow
  • function
  • 네이밍
  • class
  • 객체타입
  • 심볼
  • 호이스팅
  • SPREAD
  • 렉시컬 환경
  • 이터러블
  • 오버라이딩
  • 싱글스레드
  • PM2
  • nodemon

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갈푸라떼

갈푸라떼는 개발중

Study/JavaScript

[JavaScript_study] 클로저(Closure)

2022. 4. 14. 21:20

* 클로저 (Closures)

  • 폐쇄, 닫히는 느낌
  • 클로저란 함수와 렉시컬 환경의 조합이다.
  • 클로저란 내부함수에서 외부함수에 있는 상태에 접근할 수 있는 권한을 주는것을 말한다.
      
// 내부 블럭에서 외부 블럭으로 접근이 가능 따라서 func()함수 내부에 정의된 text는 외부 변수 text를 가져온다.
// 하지만 내부에서 선언된 변수는 외부에서는 접근할 수 없다.
const text = 'hello';
function func() {
  console.log(text);
}
func();

// 내부에서 외부를 가르킬 수 있다고 다 클로저가 아니다.
// 중첩된 함수에서 내부에 있는 함수와 외부에 있는 함수의 상태(렉시컬 환경에)에 접근할 수 있는것을 클로저라고 한다.
// 내부함수와 외부함수가 함께 묶여있는 느낌
function outer() {
  const x = 0;
  function inner() {
    // 외부에 있는 함수에 접근이 가능하다.
    // 따라서 x는 0이 된다.
    console.log(`inside inner: ${x}`);
  }
  return inner;
}
// outer함수에서 반환된 inner라는 함수의 참조값이 func1에 할당이 된다.
// 클로저에 의해서 inner함수가 return이 될때 inner함수 뿐만 아니라 outer렉시컬 환경(변수가 들어있는 렉시컬 환경)도 같이 묶여서 클로저로 반환이 된다.
// 그래서 inner함수에서도 여전히 outer에 있는 변수에 접근이 가능하다.

// inner라는 함수의 렉시컬 환경은 외부에 있는 outer함수를 참조하고 있기 떄문에 여전히 x라는 변수에 접근이 가능하다.
const func1 = outer();
func1();

 

* 클로저 활용 예시 코드

  • 예전에는 클래스와 private가 없었기 때문에 클로저의 특징을 이용해서 정보를 은닉하고 공개함수를 통해서만 정보를 조작하기 위해서 클로저를 사용하였다.
  • 내부 정보를 은닉하고, 공개 함수(public, 외부)를 통한 데이터 조작을 위해 캡슐화와 정보 은닉
  • 클래스 private 필드 또는 메소드를 사용하는 효과와 동일!
  • 이제는 클로저를 사용할 필요없이 class를 사용하면 된다.
// 클로져 활용 예제들
// 예전에는 클래스와 private가 없었기때문에 클로저의 특징을 이용해서 정보를 은닉하고 공개함수를 통해서만 정보를 조작하기 위해서 클로저를 사용하였다.

// 내부 정보를 은닉하고, 공개 함수(public, 외부)를 통한 데이터 조작을 위해
// 캡슐화와 정보은닉
// 클래스 private 필드 또는 메소드를 사용하는 효과와 동일!
function makeCounter() {
  let count = 0;
  function increase() {
    count++;
    console.log(count);
  }
  return increase;
}

// 외부에서 사용할때는 increase만 호출하면 makeCounter함수를 실행시켜줄 수 있다.
// 함수로 내가 은닉하고자 하는 데이터 상태를 감추고 오직 퍼블릭 함수만을 통해서 나의 내부 데이터를 조작할 수 있게 만들어 줄 수 있다.
const increase = makeCounter();
increase();
increase();
increase();

// 이제는 클로저를 사용할 필요없이 class를 사용하면 된다.
class Counter {
  #count = 0;
  increase() {
    this.#count++;
    console.log(this.#count);
  }
}
const counter = new Counter();
counter.increase();

'Study > JavaScript' 카테고리의 다른 글

[JavaScript_study] arrow function (화살표 함수)  (0) 2022.04.14
[JavaScript_study] This바인딩  (0) 2022.04.14
[JavaScript_study] Mixin  (0) 2022.04.14
[JavaScript_study] 상속(inheritance) // prototype, class  (0) 2022.04.14
[JavaScript_study] freeze (불변성을 추구할 때)  (0) 2022.04.14
    'Study/JavaScript' 카테고리의 다른 글
    • [JavaScript_study] arrow function (화살표 함수)
    • [JavaScript_study] This바인딩
    • [JavaScript_study] Mixin
    • [JavaScript_study] 상속(inheritance) // prototype, class
    갈푸라떼
    갈푸라떼

    티스토리툴바