[JS] 실행 컨텍스트, Lexical Environment & 호이스팅
해당 블로깅은 인프런의 강의를 들으며 공부한 내용을 정리한 글입니다.
ES5 기준 핵심 내용을 공부하면서 작성하는 블로깅
Context란 무엇일까?
사전적으로는 맥락 또는 문맥이라고 나와있다.
자바스크립트에서 실행 컨텍스트란 무엇일까?
아마도 코드 흐름 또는 코드 맥락,문맥을 뜻하는것 같다.
동일한 조건 또는 환경을 지니는 코드 집단이라고 볼 수 있다.
이게 무슨말인가? ES5 기준으로 함수를 보면 이해할 수 있다.
코드를 보면서 확인해보자
var a = 1; function outer() { console.log(a); function inner() { console.log(a); var a = 3; } inner(); console.log(a); } outer(); console.log(a);
위의 코드를 보고 콘솔이 찍히는 순서를 확인해보자.
var a = 1; function outer() { console.log(a); // 첫번 째 function inner() { console.log(a); // 두번 째 var a = 3; } inner(); console.log(a); // 세번 째 } outer(); console.log(a); // 네번 째
-
첫번째로
전역 컨텍스트가 실행이 되면서var a변수와function outer함수를 수집(선언)한다.
이것을 호이스팅이라고도 한다. 호이스팅은 우리가 이해를 돕기위한 추상적인 개념이다. 호이스팅은 현재 컨텍스트의Lexical Environment에 정보가 담기는(수집되는) 것이다. -
그 다음
전역 컨텍스트에서a에1이라는 값이 할당 된다. -
그리고 outer를 호출하면서
outer 컨텍스트가 실행된다. -
outer 컨텍스트에서는function inner함수를 수집(선언)하고, 첫번째줄 부터 실행을 하여 console.log(a);를 출력한다. 여기서 자바스크립트는 생각을 한다. 현재outer 컨텍스트의Lexical Environment에a라는 변수가 수집이 되었는가?
수집이 되어있지 않다. 그럼outerEnvironmentReference즉 현재컨텍스트 보다 외부의Lexical Environment를 찾아간다.
outer 컨텍스트의 외부는전역 컨텍스트이다. 여기로 올라가a라는 변수를 찾고 그 값을 찾느다. 전역에는 선언되 할당이 되어있음으로 그제서야console은1이라는 값을 찍어준다. -
그런 다음
inner()를 실행하고inner 컨텍스트가 실행이 되는것이다. -
그러면
inner 컨텍스트에서는 또 다시 수집(호이스팅)이 발생하고,var a를 수집한다. -
그 다음
inner 컨텍스트의 첫번 째 코드인console.log(a)를 출력하는데, 현재inner 컨텍스트의Lexical Environment에서a라는 변수를 찾는다.
그리고 여기서 6번에서 수집한var a를 찾았고 그 값을 출력하지만 아직 수집만 되어있고 값이 할당이 안되어있어 2번째console은undefined를 출력한다. -
그 다음
inner 컨텍스트의 두번째 코드인a변수에3을 할당한다. 이 할당은inner Lexical Environment에서 수집된a에게 할당되는 것이다. 전역에 있는a는 무시가 된다.
즉, 전역a는1이고 현재inner의a는3이 된다.
그렇게inner 컨텍스트끝이난다. -
그리고
outer 컨텍스트로 돌아와 마지막console을 실행한다. 이 때는4번과 같이a를전역 컨텍스트(Lexical Environment)에서 찾아1을 출력하고outer 컨텍스트는 끝이 난다. -
마지막으로
전역 컨텍스트의 마지막console이 실행되고 여기서a는 현재 자기의Lexical Environment에 수집된a를 읽어 출력하여1이 출력된다.
그래서 출력의 결과는1, undefined, 1, 1이라는 결과가 출력 된다.
- ES6문법에서는 inner()를 실행할 때 초기화를 하라는 에러를 발생시킨다.
호이스팅은 지금까지 단순 함수를 끌어올린다라고 생각했지만, 실행 컨텍스트(흐름)을 보며 확인하니 원리를 보다 더 파악할 수 있었다.
Author And Source
이 문제에 관하여([JS] 실행 컨텍스트, Lexical Environment & 호이스팅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wldns12378/JS-실행-컨텍스트-Lexical-Environment-호이스팅저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)