반응형
snowman95
코딩수련장
snowman95
전체 방문자
오늘
어제
  • 분류 전체보기 (229)
    • 앱테크 (3)
    • 옵시디언 (5)
    • 드라마, 영화 (1)
    • 개발자 이야기 (23)
    • 프로젝트 (10)
      • 프로젝트 방법론 (7)
      • 프로젝트 기록 (2)
      • Github (1)
    • 개발 지식 (0)
      • 디자인 패턴 (0)
    • 프론트엔드 개발 (5)
      • 테크트리 (2)
      • React.js (19)
      • ReactNative (2)
      • Next.js (6)
      • GraphQL (6)
      • 패키지 매니저 (2)
      • 라이브러리 (3)
      • 상태관리 라이브러리 (4)
      • Web 지식 (3)
      • HTML CSS (26)
      • Javascript (16)
      • 도구 (Tool) (3)
      • 성능 최적화 (1)
      • 디자인시스템 (0)
    • Python (53)
      • 모음집 (1)
      • 문법 (12)
      • 라이브러리 (15)
      • 알고리즘 (10)
      • 백준 문제풀이 (9)
      • 코딩테스트 (2)
      • 도구 (Tool) (3)
    • C++ (20)
      • 알고리즘 (6)
      • 삼성SW기출 (6)
      • 삼성 A형 (6)
    • 데이터사이언스 (1)
    • 인프라 (9)
      • 하드웨어 지식 (4)
      • Ansible (2)
      • Database (2)
      • 쉘스크립트 (1)
    • 주식 (0)
    • 취업 준비 (4)
      • 취업 이야기 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • GraphQL
  • 삼성SDS
  • 삼성SW역량테스트
  • 공간복잡도
  • A형
  • 면접
  • Next.js #graphql #tailwind.css
  • 전공요약
  • 언어
  • nextjs
  • 백준
  • 전공 요약 #네트워크
  • C++
  • 기계식키보드 #nuphy
  • 알고리즘
  • 전공 요약 #운영체제
  • 나의 해방일지
  • 티스토리챌린지
  • 전공 요약 #데이터베이스
  • 오블완

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
snowman95

코딩수련장

자바스크립트 - 클로저 (closure)
프론트엔드 개발/Javascript

자바스크립트 - 클로저 (closure)

2021. 8. 21. 20:31
728x90
반응형

클로저 (closure)


클로저는 함수와 Lexcial 환경의 조합이다.

함수가 생성될 때의 외부 변수를 기억하는 것이다. 생성 후에도 그 변수에 접근 가능하다.

 

 

자바스크립트는 변수에 함수를 담을 수 있다는 것을 알 것이다.

const x = sub(5);

그런데 그 함수의 반환값이 익명함수라면?
x라는 변수에 익명함수가 저장되며, 인수로 넘긴 5는 sub 함수의 내부 Lexical 환경에 등록된다. (a=5)
x함수를 호출했을 경우 x함수 안에 a란 변수는 없으므로 sub 함수의 내부 Lexical 환경에서 참조해온다.

function sub(a){        → 5)a=5를 가져옴
    return function(b){ → 3)b=10으로 인자를 받음
      return a-b;       → 4)a가 없으니 상위 함수에서 참조해옴.
    }
  }
const x = sub(5);       → 1)변수 x에 익명함수를 저장, a=5
x(10)                   → 2)익명함수 function(10)를 호출한 것.

→ 6)결과는 5-10 = -5
function plusOne(){
  let a = 0
  return function(){
    return a++;
  };
}
let p = plusOne(); → 익명함수를 저장
p();               → 0
p();               → 1
p();               → 2

 

어휘적 환경(Lexical Environment)

자바스크립트는 코드를 차례로 실행하며 내려가면서 Lexcial 환경에 등록된 변수를 초기화/할당한다.

  1. 함수 밖에서 변수를 선언하면 전역 Lexical 환경에 등록된다.

  2. 함수를 만나면 내부 Lexical 환경이 생성되고, 지역 변수는 내부 Lexcial 함수에 등록된다.
    내부 Lexcial 환경는 전역 Lexical 환경을 참조한다.
    함수 내에서 변수가 호출되면 내부 Lexcial 환경에 변수가 있는지 확인하고 없다면 전역 Lexical 환경을 참조하여 변수가 있는지 확인한다.
    내부 Lexcial 환경 →(참조)→ 전역 Lexical 환경

  3. 함수 안에서 익명 함수를 만드는 경우 익명함수 Lexcial 환경이 생성된다.
    익명함수 Lexcial 환경는 상위 함수의 내부 Lexical 환경을 참조한다.
    익명 함수 내에서 변수가 호출되면 익명함수 Lexical 환경에 변수가 있는지 확인하고 없다면 상위 함수의 내부 Lexical 환경을 참조하여 값을 가져온다. 이것이 바로 클로저다.
    익명함수 Lexcial 환경 →(참조)→ 내부 Lexcial 환경 →(참조)→ 전역 Lexical 환경

 

반응형
저작자표시 동일조건 (새창열림)

'프론트엔드 개발 > Javascript' 카테고리의 다른 글

자바스크립트 - call, apply, bind  (0) 2021.08.21
자바스크립트 - setTimeout, setInterval  (0) 2021.08.21
자바스크립트 - 진수 변환, Math 라이브러리  (0) 2021.08.21
자바스크립트 - 심볼  (0) 2021.08.21
자바스크립트 - 배열  (0) 2021.08.18
    '프론트엔드 개발/Javascript' 카테고리의 다른 글
    • 자바스크립트 - call, apply, bind
    • 자바스크립트 - setTimeout, setInterval
    • 자바스크립트 - 진수 변환, Math 라이브러리
    • 자바스크립트 - 심볼
    snowman95
    snowman95
    (17~19) Unity/Unreal Engine 게임 프로그래머 (20~21) System Administrator ___________ (22~) React 웹 프론트앤드 개발자 __________ 깃헙 : https://github.com/snowman95

    티스토리툴바