생활코딩 강의 : https://youtu.be/QtOF0uMBy7k
Execute context란 코드의 실행 문맥, 코드가 실행되고있는 환경을 의미하는 추상적인 개념이다.
모든 실행 중인 javascript 코드는 어떤 Execute context에서 실행되고 있다.
debugger를 이용해서 Execute context와 Scope 개념을 알아보자.
자바스크립트에서 Scope는 변수에 접근할 수 있는 범위라고 한다.
현재 문맥이 접근할 수 있는 데이터의 범위를 나타낸다.
크롬 개발자 도구의 debugger 기능을 이용해 Scope를 쉽게 확인할 수 있다.
이들이 어떻게 동작하는지는 차차 알아보자
<script>
n0='n0';
var v0='v0';
let l0='l0';
const c0 = 'c0';
</script>
n0
, v0
를 선언한 직후 멈춘 상태이다.n0
, v0
를 선언 했음에도 Script Scope에 보이지 않는다.var
로 선언하면 Global에 변수가 선언된다는 것을 알 수 있다.console.log
로에서 n0
를 출력하면 저장된 값이 나온다.n0
를 찾고, 없을 경우 부모 Scope인 Global Scope로 넘어와 n0
를 가져온다.let
, const
키워드로 선언한 c0
, l0
변수는 Script Scope에 저장된다.c0
, l0
를 검색하면, Script Scope에서 찾을 수 있기 때문에, Global Scope까지 접근하지 않는다.confirm
, alert
등이 작동하는 이유이다.console.log(window.v0, window.n0, window.l0, window.c0);
// Output: v0 n0 undefined undefined
window
를 명시할 경우 Global Scope에서만 변수를 조회하기 때문에 let
과 const
에 의해 Script에 저장된 변수는 찾지 못하게 된다.anonymous
는 최초로 생긴 execute context로, 전역에서 접근할 수 있어 Global Excute Context라고 한다.anonymous
에서 함수 fn1
을 실행할 경우 callstack에 fn1
이 쌓이는 것을 확인할 수 있다. 이렇게 함수가 호출되어 생긴 execute context는 Function Excute Context라고 한다.function fn1(){
n1='n1';
var v1='v1';
let l1='l1';
const c1='c1';
fn2();
}
fn1();
f1
함수 내에서 f2
함수를 호출한 경우이다.Local
이라는 Scope가 추가되었다. 여기에는 함수 내에서 선언된 지역 변수들이 위치한다.f1
함수 내에서 f2
를 호출했음에도 f1
Scope에서 f2
Local Scope로 접근할 수 없다는 점이다.function fn1(){
n1='n1';
var v1='v1';
let l1='l1';
const c1='c1';
fn2();
}
fn1();
n1 = ‘n1’
n1
변수를 선언하면 여전히 Global Scope에 저장되는 것을 확인할 수 있다.var v1=’v1’
var
키워드는 Global execute context때와 다르게 Local Scope에 변수가 저장된다.키워드 | Global execute context | Funtion execute context |
---|---|---|
a = 1 | Global | Global |
var a = 1 | Global | Local |
let a = 1 | Script | Local |
const a = 1 | Script | Local |
생활코딩 Closure 강의 : https://youtu.be/bwwaSwf7vkE
fn1
안에서 실행된 fn2
의 Scope를 fn1
에서 접근하지 못했듯이, Javascript에서는 Dynamic Scope를 채택하지 않고 있다.function fn2 () {
let l2 = 'l2'
console.log(l1, l2)
}
function fn1 () {
let l1 = 'l1'
fn2()
}
fn1() // 에러 발생
fn1
, fn2
가 동등한 동일한 Scope에서 선언되었기 때문에 서로 독립적인 Local Scope를 갖는다.fn2
가 fn1
에서 호출되었어도, fn2
는 l1
값을 알 수 없어 에러가 발생한다. (javascript가 동적 Scope를 따르지 않는다는 의미)function fn1 () {
function fn2 () {
let l2 = 'l2'
console.log(l1, l2)
}
let l1 = 'l1'
fn2()
}
fn1() // l1 l2
fn2
함수가 fn1
함수 내에서 선언이 되었다.Closure (fn1)
이라는 Scope가 생성되었고, fn1
함수의 Local Scope가 저장되어있는 것을 알 수 있다.지난번 this
에 대해 글을 정리하다가, lexical context
, scope
와 같은 말들을 이해하기 너무 어려워서 관련 개념을 찾아보게 되었다.
그런데 이고잉님이 너무 쉽고 좋은 강의를 올려주신게 있어서 이를 바탕으로 정리해보았다.
이고잉님은 신이다..