-
실행컨텍스트와 클로저TodayILearned/javascript 2021. 6. 25. 17:33
poiemWEB,제로초님의 블로그글을 읽고 공부한 내용을 정리했습니다.
실행컨텍스트
실행 가능한 코드를 형상화하고 구분하는 추상적인 개념
브라우저가 스크립트를 실행하는 순간, 전역 컨텍스트가 생성됨( 모든것을 관리하는 환경)
이후 함수를 호출할 때 마다 함수 컨텍스트가 하나씩 생성된다.컨텍스트의 네가지 원칙
- 전역 컨텍스트 생성 후, 함수 호출 시 마다 컨텍스트가 생성
- 컨텍스트 생성 시 컨텍스트 안에 변수객체(variavle, argument), scope chain, this가 생성됨
- 컨텍스트 생성 후 함수 실행, 사용되는 변수들을 변수 객체 안에서 찾고 없다면 스코프 체인을 따라 올라가며 찾는다.
- 함수 실행이 마무리되면 해당 컨텍스트는 사라짐(클로저 제외) 페이지가 종료되면 전역 컨텍스트는 사라짐.
var x = 'xxx'; function foo () { var y = 'yyy'; function bar () { var z = 'zzz'; console.log(x + y + z); } bar(); } foo();
전역컨텍스트
전역 컨텍스트는 argument가 없고, variable은 해당 스코프의 변수들이다. scope chain은 자기 자신인 변수 객체.
this 따로 설정되어있지 않으면 자기 자신이다.'전역컨텍스트' : { 변수객체: { argument: null, variable: [x,y,z,foo,bar], }, scopeChain: ['전역변수객체'] this: window, }
함수 컨텍스트
'foo 컨텍스트': { 변수객체: { arguments: null, variable: y, bar, z }, scopeChain: ['전역변수객체', 'foo변수객체'], this: window, }
'bar 컨텍스트' : { 변수객체: { arguments: null, variable: [z], }, scopeChain: ['전역 변수객체','bar 변수객체','foo변수객체'], this: window, }
코드를 따라 실행 컨텍스트가 쌓이게되고(main > foo() > bar()), foo 함수가 실행된 후 bar함수가 실행된다. bar 컨텍스트 안의 console.log의 x,y,z는 bar컨텍스트 안에서 찾는다. z는 찾았지만 x,y는 전역변수 객체와 foo변수객체에서 찾는다.
x= xxx, y= yyy
bar함수가 실행된 후 스택에서 삭제되고, foo컨텍스트 스택이 삭제되고, 마지막에 전역 컨텍스트도 삭제된다.
클로저
함수를 일급 객체로 하는 함수형 프로그래밍 언어의 특성.
반환된 내부함수가 자신이 선언됐을 때 환경인 스코프를 기억하여 자신이 선언됐을 때의 환경(렉시컬 환경)을 기억하여, 자신이 선언됐을 때의 환경(스코프) 밖에서도 그 환경에 접근할 수 있는 함수.
즉 클로저는 자신이 생성될 때의 환경(렉시컬 환경)을 기억하는 함수다.실행 컨텍스트의 관점에서 외부함수가 종료되어 반환돼도, 외부함수 실행 컨텍스트의 활성객체(Activation Object)는 내부함수에 의해 참조되는 한 유효하며, 내부함수가 스코프체인을 통해 참조할 수 있는것을 의미한다.
클로저는 렉시컬 환경을 기억해야하므로 메모리적 손해를 볼 수 있지만, 현재 상태를 기억하고 변경된 최신상태를 유지하는 기능이 있다.
클로저로 생성된 변수는 private변수로, 전역변수를 사용했을 때와 같이 의도치않은 변경에 대한 걱정이 없다. 따라서 안정적인 프로그래밍이 가능하다.reference :
https://poiemaweb.com/js-eecution-context
https://www.zerocho.com/category/Javascript/post/5741d96d094da4986bc950a0
'TodayILearned > javascript' 카테고리의 다른 글
자바스크립트는 싱글스레드인가? (0) 2021.06.24 The Complete JavaScript Course 2021(2) (0) 2021.06.23 The Complete JavaScript Course 2021(1) (0) 2021.06.22 랜덤한 알파벳과 숫자가 나오는 HEX CODE 작성하기 (0) 2021.01.29 airbnb JavaScript Style Guide 적용하여 코드 수정하기 (0) 2021.01.27