์๋ฐ์คํฌ๋ฆฝํธ์ ํธ์ด์คํ
(hoisting)์ ์ฝ๋๋ฅผ ํ ์ค ํ ์ค ์คํํ๊ธฐ์ ์์, ์ ์ธ๋ ๋ณ์, ํจ์, ํด๋์ค ๋ฑ์ ์ ์ธ๋ฌธ์ ์ฝ๋์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค ๋ฐํ์ ์ด์ ์ ํ ๋ฒ ์คํํด ๋ฉ๋ชจ๋ฆฌ์ ๋ฏธ๋ฆฌ ์ฌ๋ ค๋๋ ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์คํ ์ปจํ
์คํธ(Execution Context)๋ฅผ ์์ฑํ๋ฉฐ ๋ณ์์ ํจ์ ์ ์ธ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์์ ๋น๋กฏ๋ฉ๋๋ค. ํธ์ด์คํ
๋๋ถ์ ๊ฐ๋ฐ์๋ ์ฝ๋์ ๋ฌผ๋ฆฌ์ ์์น์ ์๊ด์์ด ๋ณ์๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง, ์ด๋ก ์ธํด ์์์น ๋ชปํ ๋์์ด ๋ฐ์ํ ์๋ ์์ด ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
๐ ๋ณ์ ํธ์ด์คํ
var ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ํธ์ด์คํ
๊ณผ์ ์์ ๋ณ์ ์ ์ธ๊ณผ ๋์์ undefined๋ก ์ด๊ธฐํ๋ฉ๋๋ค. ์ฆ, ๋ณ์๊ฐ ์ ์ธ๋ ์ค ์ด์ ์ ํด๋น ๋ณ์๋ฅผ ํธ์ถํ๋๋ผ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ undefined ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๋ var๊ฐ ์ ์ธ(Declaration)๊ณผ ์ด๊ธฐํ(Initialization)๊ฐ ๋์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฐ๋ฉด, let๊ณผ const ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ํธ์ด์คํ ์ด ๋ฐ์ํ๊ธฐ๋ ํ์ง๋ง, ์ ์ธ(Declaration)๊ณผ ์ด๊ธฐํ(Initialization)๊ฐ ๋์์ ์ด๋ฃจ์ด์ง์ง ์์ต๋๋ค. let๊ณผ const๋ก ์ ์ธ๋ ๋ณ์๋ ์คํ ์ปจํ ์คํธ ๋ด์ ์ ์ธ์ ํ๊ฒฝ ๋ ์ฝ๋(Declarative Environment Record)์ ๋ฑ๋ก๋ฉ๋๋ค. ์ด๋ ์คํ ์ปจํ ์คํธ์ ์์ฑ ๋จ๊ณ์์ ๋ณ์๋ ์ ์ธ ๋์์ผ๋, ์ด๊ธฐํ๋ ์ค์ ์ฝ๋ ์คํ ์์ (๋ณ์๊ฐ ์ ์ธ๋ ์์ )์์ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด ์ง๋๋ค.
๋ณ์๊ฐ ์ ์ธ๋ ์์ ๋ถํฐ ์ค์ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง ๋๊น์ง์ ๊ตฌ๊ฐ์ TDZ(Temporary Dead Zone, ์์ ์ฌ๊ฐ์ง๋)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ด ๊ตฌ๊ฐ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ค๊ณ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ง ํ ๋น๋์ง ์์๊ธฐ ๋๋ฌธ์ ReferenceError๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฐ๋ฉด, let๊ณผ const ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ํธ์ด์คํ ์ด ๋ฐ์ํ๊ธฐ๋ ํ์ง๋ง, ์ ์ธ(Declaration)๊ณผ ์ด๊ธฐํ(Initialization)๊ฐ ๋์์ ์ด๋ฃจ์ด์ง์ง ์์ต๋๋ค. let๊ณผ const๋ก ์ ์ธ๋ ๋ณ์๋ ์คํ ์ปจํ ์คํธ ๋ด์ ์ ์ธ์ ํ๊ฒฝ ๋ ์ฝ๋(Declarative Environment Record)์ ๋ฑ๋ก๋ฉ๋๋ค. ์ด๋ ์คํ ์ปจํ ์คํธ์ ์์ฑ ๋จ๊ณ์์ ๋ณ์๋ ์ ์ธ ๋์์ผ๋, ์ด๊ธฐํ๋ ์ค์ ์ฝ๋ ์คํ ์์ (๋ณ์๊ฐ ์ ์ธ๋ ์์ )์์ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด ์ง๋๋ค.
๋ณ์๊ฐ ์ ์ธ๋ ์์ ๋ถํฐ ์ค์ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง ๋๊น์ง์ ๊ตฌ๊ฐ์ TDZ(Temporary Dead Zone, ์์ ์ฌ๊ฐ์ง๋)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ด ๊ตฌ๊ฐ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ค๊ณ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ง ํ ๋น๋์ง ์์๊ธฐ ๋๋ฌธ์ ReferenceError๊ฐ ๋ฐ์ํฉ๋๋ค.
๐ ํจ์ ์ ์ธ๊ณผ ํธ์ด์คํ
ํจ์ ์ ์ธ(Function Declaration)์ ๊ฒฝ์ฐ, ๋ณ์์๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํธ์ด์คํ
๋ฉ๋๋ค. ํจ์ ์ ์ธ์ ์ ์ธ๊ณผ ์ด๊ธฐํ, ๊ทธ๋ฆฌ๊ณ ํจ์ ๋ณธ๋ฌธ ์ ์ฒด๊ฐ ํจ๊ป ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ ํจ์๊ฐ ์ ์ธ๋ ์ค ์ด์ ์ ํธ์ถํ๋๋ผ๋ ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ด๋ ํจ์ ์ ์ธ์ด ์คํ ์ปจํ
์คํธ์ ์์ฑ ๋จ๊ณ์์ ์์ ํ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋จ, ํจ์ ํํ์(Function Expression)์ผ๋ก ์์ฑ๋ ๊ฒฝ์ฐ์๋ ๋ค๋ฆ
๋๋ค.
ํจ์ ํํ์(Function Expression)์ ๋ณ์์ ํจ์๋ฅผ ํ ๋นํ๋ ๋ฐฉ์์ด๋ฏ๋ก, ์ฌ์ฉ๋ ๋ณ์ ํค์๋(var, let, const)์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๋๋ค.
bar(); // TypeError: bar is not a function var bar = function() { console.log("This is bar"); };
์ ์์์์ bar๋ var๋ก ์ ์ธ๋์์ผ๋ฏ๋ก undefined๋ก ์ด๊ธฐํ๋ ์ํ์์ ํจ์ ํธ์ถ์ด ์๋๋์ด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ๋ ๋ณ์ ์ ์ธ ํค์๋(var, let, const)์ ์ด๊ธฐํ ๊ท์น์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ค๋ง, ๋ฐ์ํ๋ ์๋ฌ์ ์ข
๋ฅ๋ ํค์๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
์คํ ์ปจํ ์คํธ(Execution Context)
์คํ ์ปจํ
์คํธ(Execution Context)๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ์ ์ํ๊ณ ๊ด๋ฆฌํ๋ ๋ด๋ถ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์
๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ์ฝ๋ ์คํ์ ์ค๋นํ๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ค์ ํ๋ ๊ณผ์ ์ ์๋ฏธ์ด๊ธฐ๋ ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋๋ฅผ ์คํํ ๋, ํด๋น ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ ์ ์๋๋ก ๋ณ์, ํจ์, ์ค์ฝํ, this ๋ฐ์ธ๋ฉ ๋ฑ์ ์ถ์ ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
๐ ์์ฑ ๋จ๊ณ(Creation Phase)
์คํ ์ปจํ
์คํธ(Execution Context) ์์ฑ ๋จ๊ณ(Creation Phase)์์๋ ์ฝ๋๊ฐ ์ค์ ๋ก ์คํ๋๊ธฐ ์ ์ ์คํ ์ปจํ
์คํธ๋ฅผ ์ด๊ธฐํํฉ๋๋ค. ๋ณ์, ํจ์ ์ ์ธ, ํจ์์ ์ธ์ ๋ฑ์ด ์ปจํ
์คํธ์ ์ ์ฅ๋ฉ๋๋ค. ES6 ์ดํ๋ก๋ ํ๊ฒฝ ๋ ์ฝ๋(Environment Record)๋ผ๋ ๊ฐ๋
์ผ๋ก ํ์ฅ๋์์ต๋๋ค.
- var๋ก ์ ์ธ๋ ๋ณ์๋ undefined๋ก ์ด๊ธฐํ๋ฉ๋๋ค.
- let๊ณผ const๋ ์ ์ธ๋ง ๋๊ณ ์ด๊ธฐํ๋ ๋์ค์ ์ด๋ฃจ์ด์ง๋๋ค(TDZ).
- ํจ์ ์ ์ธ์ ์ ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋๋ค.
ํ์ฌ ์ปจํ
์คํธ์์ ์ ๊ทผ ๊ฐ๋ฅํ ์ธ๋ถ ๋ณ์๋ค์ ์ค์ฝํ ์ฒด์ธ(Scope Chain)์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ ์ค์ฒฉ๋ ํจ์์์ ์์ ์ค์ฝํ๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ํฉ๋๋ค. ํ์ฌ ์คํ ์ค์ธ ์ฝ๋์์ this๊ฐ ๊ฐ๋ฆฌํฌ ๊ฐ์ฒด๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค. ํจ์ ํธ์ถ ๋ฐฉ์(์: ๋ฉ์๋ ํธ์ถ, ์ผ๋ฐ ํจ์ ํธ์ถ ๋ฑ)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๐ ์คํ ๋จ๊ณ(Execution Phase)
์คํ ์ปจํ
์คํธ(Execution Context) ์คํ ๋จ๊ณ(Execution Phase)์์๋ ์์ฑ ๋จ๊ณ๊ฐ ์๋ฃ๋๋ฉด ์ฝ๋๊ฐ ํ ์ค์ฉ ์คํ๋ฉ๋๋ค. ์ด ๋จ๊ณ์์ ๋ณ์์ ๊ฐ์ด ํ ๋น(Assignment)๋๊ณ , ํจ์๊ฐ ํธ์ถ๋๋ฉฐ, ์ค์ ๋ก์ง์ด ์ํ๋ฉ๋๋ค.
์คํ ์ปจํ ์คํธ์ ์ข ๋ฅ
- ์ ์ญ ์คํ ์ปจํ ์คํธ(Global Execution Context): ์ ์ญ ์ค์ฝํ์์ ์คํ๋๋ ์ฝ๋๋ฅผ ์ํ ์ปจํ ์คํธ์ ๋๋ค. ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ ํ๋๋ง ์์ฑ๋๋ฉฐ, ์ ์ญ ๊ฐ์ฒด(๋ธ๋ผ์ฐ์ ์์๋ window, Node.js์์๋ global)์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
- ํจ์ ์คํ ์ปจํ ์คํธ(Function Execution Context): ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์์ฑ๋ฉ๋๋ค. ๊ฐ ํจ์ ํธ์ถ์ ๋ ๋ฆฝ์ ์ธ ์คํ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ง๋ฉฐ, ํจ์๊ฐ ๋๋๋ฉด ํด๋น ์ปจํ ์คํธ๋ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
- Eval ์คํ ์ปจํ ์คํธ(Eval Execution Context): eval() ํจ์๊ฐ ์คํ๋ ๋ ์์ฑ๋ฉ๋๋ค(๋๋ฌผ๊ฒ ์ฌ์ฉ๋จ).
๊ด๋ จ ํค์๋
์ปจํ ์คํธ(this)๋ฅผ ์ ์ดํ๋ ํจ์ call()
์ปจํ ์คํธ(this)๋ฅผ ์ ์ดํ๋ ํจ์ apply()
์ปจํ ์คํธ(this)๋ฅผ ์ ์ดํ๋ ํจ์ bind()