- ์คํ ์ปจํ
์คํธ๋
์ฝ๋์ ์คํ ํ๊ฒฝ์ ๋ํ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด(Scope, Hoisting, this, function, closure ๋ฑ)๋ฅผ ๋ด๊ณ ์๋ ๊ฐ๋ ์ด๋ค. - ๊ฐ๋จํ ๋งํ๋ฉด
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ๋ง๋ค์ด์ง๊ณ ์ฌ์ฉ๋๋ ์ฝ๋ ์ ๋ณด๋ฅผ ๋ด์๊ฐ์ฒด์ ์งํฉ์ด๋ผ๊ณ ํ ์ ์๋ค. - ์คํ ์ปจํ ์คํธ๋ฅผ ๋ฐ๋ก ์ดํดํ์ง ๋ชปํ๋ฉด ์ฝ๋ ๋ ํด๊ฐ ์ด๋ ค์์ง๋ฉฐ ๋๋ฒ๊น ๋ ๋งค์ฐ ๊ณค๋ํด ์ง ๊ฒ์ด๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ 3๊ฐ์ง๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- ์ ์ญ ์ฝ๋, ํจ์ ์ฝ๋๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์คํ ๊ฐ๋ฅํ ์ฝ๋์ด๋ค.
1. ์ ์ญ ์ฝ๋: ์ ์ญ ์์ญ์ ์กด์ฌํ๋ ์ฝ๋
2. ํจ์ ์ฝ๋: ํจ์ ๋ด์ ์กด์ฌํ๋ ์ฝ๋
3. Eval ์ฝ๋: eval()๋ก ์คํ๋๋ ์ฝ๋
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ์ฌ ์คํ์ ํ์ํ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ฅผ ์๊ณ ์์ด์ผ ํ๋ค.
- ์ด๋ฌํ
์คํ์ ํ์ํ ์ ๋ณด๋ค์ ํ์ํํ๊ณ ๊ตฌ๋ถํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํ ์ปจํ ์คํธ๋ฅผ๊ฐ์ฒด์ ํํ๋ก ๊ด๋ฆฌํ๋ค.
1. ๋ณ์: ์ ์ญ ๋ณ์, ์ง์ญ ๋ณ์, ๋งค๊ฐ ๋ณ์, ๊ฐ์ฒด์ ํ๋กํผํฐ
2. ํจ์ ์ ์ธ
3. ๋ณ์์ ์ ํจ๋ฒ์ (Scope)
4. this
-
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ์ผ์ ์คํํ๊ธฐ ์ ์
๊ธ๋ก๋ฒ ์คํ ์ปจํ ์คํธ(Global Execution Context, GEC)๊ฐ ์์ฑ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ์ผ์ ์คํํ๊ธฐ ์ ์
-
- ๊ทธ๋ฆฌ๊ณ ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค
ํจ์ ์คํ ์ปจํ ์คํธ(Function Execution Context, FEC)๊ฐ ์์ฑ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค
- ์ด๋ ์ฃผ์ํ ์ ์, ๊ธ๋ก๋ฒ์ ๊ฒฝ์ฐ
์คํ ์ด์ ์ ์์ฑ๋์ง๋ง, ํจ์์ ๊ฒฝ์ฐํธ์ถํ ๋์์ฑ๋๋ค๋ ๊ฒ์ด๋ค.
- ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๋ฉด ํํ
์ฝ ์คํ(Call Stack)์ด๋ผ๊ณ ๋ถ๋ฆฌ๋์คํ ์ปจํ ์คํธ ์คํ์ ์์ด๊ฒ ๋๋ค. GEC๋ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์์ด๊ณ , ๋ชจ๋ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ ๊ฑฐ๋๋ค.FEC๋ ํจ์๋ฅผ ํธ์ถํ ๋ ์์ด๊ณ ํธ์ถ์ด ๋๋๋ฉด ์ ๊ฑฐ๋๋ค.
var x = "xxx";
function foo() {
var y = "yyy";
function bar() {
var z = "zzz";
console.log(x + y + z);
}
bar();
}
foo();- ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์๋์ ๊ฐ์ด ์คํ ์ปจํ ์คํธ ์คํ์ด ์์ฑ๋๊ณ ์๋ฉธํ๋ค.
- ํ์ฌ ์คํ ์ค์ธ ์ปจํ ์คํธ์์ ํด๋น ์ปจํ ์คํธ์ ๊ด๋ จ ์๋ ์ฝ๋(ex. ๋ค๋ฅธ ํจ์)๋ค์ ์คํ๋๋ฉด ์๋ก์ด ์ปจํ ์คํธ๊ฐ ์์ฑ ๋๋ค.
- ์ด ์ปจํ ์คํธ๋ ์คํ์ ์์ด๊ฒ ๋๊ณ ์ปจํธ๋กค(์ ์ด๊ถ)์ด ์ด๋ํ๋ค.
- ์คํ ์ปจํ
์คํธ๋
Lexical Environment,Variable Environment,this ๋ฐ์ธ๋ฉ3๊ฐ์ ๊ตฌ์ฑ์์๋ฅผ ๊ฐ๋๋ค.
- Lexical Environment๋
๋ณ์ ๋ฐ ํจ์ ๋ฑ์ ์๋ณ์(Identifier) ๋ฐ ์ธ๋ถ ์ฐธ์กฐ์ ๊ดํ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ ์ปดํฌ๋ํธ์ด๋ค. ์ด ์ปดํฌ๋ํธ๋Environment Record,outer ์ฐธ์กฐ2๊ฐ์ ๊ตฌ์ฑ์์๋ฅผ ๊ฐ๋๋ค. - Environment Record๊ฐ ์๋ณ์์ ๊ดํ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ, outer ์ฐธ์กฐ๋ ์ธ๋ถ Lexical Environment๋ฅผ ์ฐธ์กฐํ๋ ํฌ์ธํฐ์ธ๋ค.
- ์ข ๋ ํ์ด์ฐ์๋ฉด Environment Record๋
์ต์ด์ ๋ณ์,Arguments,ํจ์ ์ ์ธ๋ค์ ์ ์ฅํ๋ค. - outer๋
๋ถ๋ชจ Environment(reference)๋ฅผ ์ ์ฅํ๋ค. - ์คํ ์ปจํ ์คํธ๋ ์์ฑ ๋ ๋, Lexical Environment์ Variable Environment์ ๊ตฌ์ฑ ์์๋ ๋์ผํ ๊ฐ์ ๊ฐ์ง๋, ์ปจํ ์คํธ ๋ด์์ ์ฝ๋๋ฅผ ์คํํ๋ ๋์ Variable Environment์ ๋ฌ๋ฆฌ Lexical Environment์ ๊ตฌ์ฑ์์์ ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์๋ค.
var x = 10;
function foo() {
var y = 20;
console.log(x);
}- ์์ ๊ฐ์ ์ฝ๋๊ฐ ์์ ๋๋ ์๋์ ๊ฐ์ด Lexical Environment๊ฐ ํ์ฑ๋๋ค.
globalEnvironment = {
environmentRecord = { x: 10 },
outer: null
}
fooEnvironment = {
environmentRecord = { y: 20 },
outer: globalEnvironment
}- ๋ฐ๋ผ์,
foo()์์x๋ฅผ ์ฐธ์กฐํ ๋๋ fooEnvironment์ Environment Record๋ฅผ ์ฐพ์๋ณด๊ณ , ์๊ธฐ ๋๋ฌธ์ outer ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ์ Lexical Environment์ ์ํด ์๋ Environment Record๋ฅผ ์ฐพ์๋ณด๋ ๋ฐฉ์์ด๋ค.
- Variable Environment๋ Lexical Environment์ ๋์ผํ ์ฑ๊ฒฉ์ ๊ฐ์ง๋ง
var๋ก ์ ์ธ๋ ๋ณ์๋ง ์ ์ฅํ๋ค๋ ์ ์์ ๋ค๋ฅด๋ค. - ์ฆ, Lexical Environment๋
var๋ฅผ ์ ์ธํ,let,ํจ์ ์ ์ธ๋ฌธ,ํจ์ ๋งค๊ฐ ๋ณ์๋ค์ ์ ์ฅํ๋ค. - ์ฝ๋์ ์ํด ์๋ก์ด ๋ณ์/ํจ์๊ฐ ์ถ๊ฐ๋๋๋ผ๋ ์ ๋ ๊ฐ์ด ๋ณํ์ง ์๋๋ค.
- ์ฝ๋ ์ฐธ๊ณ
- this์ ๋ฐ์ธ๋ฉ์ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ ๋๋ง๋ค this ๊ฐ์ฒด์
์ด๋ป๊ฒ ๋ฐ์ธ๋ฉ์ด ๋๋์ง๋ฅผ ๋ํ๋ธ๋ค. ์ฆ, ์คํ ์ปจํ ์คํธ์this ํค์๋์ ๋ฐํ ๊ฐ์ ์ ์ฅํ๋ค. - this์ ํค์๋๋
ํ์ฌ ์ปจํ ์คํธ๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ, ํจ์ ํธ์ถ ํจํด์์ํด ๊ฒฐ์ ๋๋ค. - ES6๋ถํฐ๋ this์ ๋ฐ์ธ๋ฉ์ด Lexical Environment ์์ ์๋ Environment Record ์์์ ์ผ์ด๋๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์.(๊ทธ๋ ๊ฒ ์ค์ํ์ง๋ ์๋ค.)
- GEC์ ๊ฒฝ์ฐ
- Strict Mode๋ผ๋ฉด
undefined๋ก ๋ฐ์ธ๋ฉ ๋๋ค. - Strict Mode๊ฐ ์๋๋ผ๋ฉด ๊ธ๋ก๋ฒ ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉ ๋๋ค.(๋ธ๋ผ์ฐ์ ์์ Window, ๋ ธ๋์์ Global)
- Strict Mode๋ผ๋ฉด
- FEC์ ๊ฒฝ์ฐ
- ํด๋น ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋์ง์ ๋ฐ๋ผ ๋ฐ์ธ๋ฉ ๋๋ค.
- Execution Context๋ 2๊ฐ์ง ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- Creation Phase(์์ฑ ๋จ๊ณ), Execution Phase(์คํ ๋จ๊ณ)
- ์์ฑ ๋จ๊ณ๋ ๋ค์ 3๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ค.
- Lexical Environment ์์ฑ, Variable Environment ์์ฑ, this ๋ฐ์ธ๋ฉ
- ์ฃผ์ํ ์ ์ ๊ฐ์ด ๋ณ์์ ๋งคํ๋์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
var์ ๊ฒฝ์ฐundefined๋ก ์ด๊ธฐํ๋๊ณ ,let์ด๋const๋ ์๋ฌด ๊ฐ๋ ๊ฐ์ง์ง ์๋๋ค.
- ์ฝ๋๋ฅผ ์คํํ๋ฉด์ ๋ณ์์ ๊ฐ์ ๋งคํ์ํจ๋ค. ์์๋ฅผ ๋ณด์
var a = 3;
let b = 4;
function func(num) {
var t = 9;
console.log(a + b + num + t);
}
var r = func(4);- GEC์ ์์ฑ ๋จ๊ณ, ์ฌ๊ธฐ์ ์์ฑ์ด ๋ ๋ ์คํ ์ปจํ ์คํธ ์คํ์ ์์ธ๋ค.
GEC {
ThisBinding: window,
LexicalEnvironment: {
EnvironmentRecord: {
b: <uninitialized>,
func: func(){...}
},
outer: null
},
VariableEnvironment: {
EnvironmentRecord: {
a: undefined,
r: undefined
},
outer: null
}
}- GEC์ ์คํ ๋จ๊ณ
GEC {
ThisBinding: window,
LexicalEnvironment: {
EnvironmentRecord: {
b: 4,
func: func(){...}
},
outer: null
},
VariableEnvironment: {
EnvironmentRecord: {
a: 3,
r: undefined
},
outer: null
}
}- ์ดํ์
func()์ ํธ์ถํ๊ณ FEC๋ฅผ ์์ฑํ๋ค.
- FEC์ ์์ฑ ๋จ๊ณ
FEC {
ThisBinding: window,
LexicalEnvironment: {
EnvironmentRecord: {
arguments: { num: 4, length: 1 },
},
outer: GEC์ LexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord: {
t: undefined
},
outer: GEC์ LexicalEnvironment
}
}- FEC์ ์คํ ๋จ๊ณ
FEC {
ThisBinding: window,
LexicalEnvironment: {
EnvironmentRecord: {
arguments: { num: 4, length: 1 },
},
outer: GEC์ LexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord: {
t: 9
},
outer: GEC์ LexicalEnvironment
}
}- FEC๊ฐ ์คํ์์ ์ ๊ฑฐ ๋๊ณ GEC์
r์ด 20์ผ๋ก ์ด๊ธฐํ ๋๋ค.
GEC {
ThisBinding: window,
LexicalEnvironment: {
EnvironmentRecord: {
b: 4,
func: func(){...}
},
outer ์ฐธ์กฐ: null
},
VariableEnvironment: {
EnvironmentRecord: {
a: 3,
r: 20
},
outer ์ฐธ์กฐ: null
}
}- ๋ชจ๋ ์ฝ๋๋ฅผ ์คํํ๊ณ GEC๊ฐ ์คํ์์ ์ ๊ฑฐ๋ ๋ค ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
- ์ฝ๋ ์ฐธ๊ณ ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋ ํ์คํ ์ดํดํ ์ ์๋ค.
https://github.com/baeharam/Must-Know-About-Frontend/blob/master/Notes/javascript/execution-context.md https://minjung-jeon.github.io/Execution-Context/ https://velog.io/@imacoolgirlyo/JS-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-Hoisting-The-Execution-Context-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-6bjsmmlmgy https://poiemaweb.com/js-execution-context