
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ์ด๋ป๊ฒ ์คํ๋ ๊น?
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ์ด๋ป๊ฒ ์คํ๋ ๊น? ๊ด๋ จ
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๊น์? ์ฐ๋ฆฌ๊ฐ ๋จ์ํ console.log(โHello, world!โ)๋ผ๊ณ ์ ๋ ฅํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ด๋ป๊ฒ ์ด๋ฅผ ํด์ํ๊ณ ์คํํ ๊น์? ์ฌ์ค ์ฐ๋ฆฌ๊ฐ ๋ณด๋ ์ฝ๋์ ์ปดํจํฐ๊ฐ ์ดํดํ๋ ์ฝ๋๋ ์ ํ ๋ค๋ฆ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ปดํจํฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์คํํ๋ ๊ฒ์ธ์ง ์ดํด๋ด ์๋ค.
์ปดํจํฐ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์์ฐ์ด๋ฅผ ๊ทธ๋๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ํด์ํ๊ณ , ์คํ ๊ฐ๋ฅํ ํํ๋ก ๋ณํํ ํ, ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ์ด ๊ณผ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ค์ํ ์ญํ ์ ํ๋ฉฐ, ์ฝ๋๊ฐ ํ์ฑ(Parsing), ์ปดํ์ผ(Compilation), ์คํ(Execution) ๊ณผ์ ์ ๊ฑฐ์ณ ์คํ๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ ๊ณผ์ ์ ์ดํดํ๋ฉด ์ฝ๋ ์ต์ ํ, ํธ์ด์คํ , ์ค์ฝํ ๋ฑ์ ๊ฐ๋ ์ ๋ช ํํ๊ฒ ํ์ ํ ์ ์์ต๋๋ค. ํนํ ํจ์ ํธ์ถ์ด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๋์ง, ์คํ ์ปจํ ์คํธ๊ฐ ์ด๋ป๊ฒ ๊ด๋ฆฌ๋๋์ง๋ฅผ ์๋ฉด, ์์์น ๋ชปํ ๋ฒ๊ทธ๋ฅผ ์ค์ด๊ณ ๋ณด๋ค ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋๋ ์ ์ฒด ๊ณผ์ ๊ณผ ์คํ ์ปจํ ์คํธ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์คํ ๊ณผ์
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๊ธฐ ์ํด ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค. ํฌ๊ฒ ํ์ฑ, ์ปดํ์ผ, ์คํ ์ธ ๋จ๊ณ๋ก ๋๋ ์ ์์ต๋๋ค.
1. ํ์ฑ(Parsing)
์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋จผ์ ํ์ฑ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ์ด ๊ณผ์ ์์ ์์ง์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ๋ฌธ๋ฒ์ ์ผ๋ก ๋ถ์ํ๊ณ , ์คํํ ์ค๋น๋ฅผ ํฉ๋๋ค.

๋จผ์ ํ ํฐํ(Tokenization) ๋จ๊ณ์์ ์ฝ๋ ๋ฌธ์์ด์ ์๋ฏธ ์๋ ์ต์ ๋จ์(ํ ํฐ)๋ก ๋ถํดํฉ๋๋ค. ์๋ฅผ ๋ค์ด, let x = 10; ์ด๋ผ๋ ์ฝ๋๋ let, x, =, 10, ;์ ๊ฐ์ ๊ฐ๋ณ ํ ํฐ์ผ๋ก ๋๋์ด์ง๋๋ค. ์ดํ ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ(AST, Abstract Syntax Tree) ์์ฑ ๋จ๊ณ์์, ํ์ฑ๋ ํ ํฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ํธ๋ฆฌ ํํ๋ก ๋ณํํฉ๋๋ค.
AST๋ ๋ง ๊ทธ๋๋ก ์์ค ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ํธ๋ฆฌ ํํ๋ก ํํํ ์๋ฃ๊ตฌ์กฐ๋ก, ์ฝ๋์ ๊ตฌ์ฑ ์์๋ฅผ ๋ถ์ํ๊ณ ์ต์ ํํ๋ฉฐ, ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ๋์ฑ ํธ๋ฆฌํ๊ฒ ๊ฒ์ถํ ์ ์๋๋ก ๋์์ค๋๋ค. ์ด ํธ๋ฆฌ๋ ์ดํ ๋จ๊ณ์์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ์ต์ ํ ๊ณผ์ ์์ ์ฝ๋ ์กฐ์์ ์ํํ๋ ๋ฐ ํ์ฉ๋ฉ๋๋ค.
์ด ํธ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ดํ ๋จ๊ณ์์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ์ต์ ํ ๊ณผ์ ์์ ์ฝ๋ ์กฐ์์ ์ํํ๋ ๋ฐ ํ์ฉ๋ฉ๋๋ค. ์ฆ, AST๋ ์ปดํจํฐ๊ฐ ์ฝ๋๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ๋ถ์ํ๊ณ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ณํํ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
2. ์ปดํ์ผ(Compilation)
AST๊ฐ ์์ฑ๋ ํ, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฅผ ๋ฐ์ดํธ ์ฝ๋(Bytecode)๋ก ๋ณํํ๋ ์ปดํ์ผ(Compilation) ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. โ๋ฐ์ดํธ ์ฝ๋๋ก ์ปดํ์ผํ๋ค.โ๋ผ๋ ๋ง์ด ์ด๋ ต๊ฒ ๋๊ปด์ง๋ค๋ฉด ์ ๋ถ ๋ค ์๊ณ , ์ปดํ์ผ ๊ณผ์ ์ ๋ํ๋ด๋ ๊ทธ๋ฆผ์ ๋จผ์ ์ดํด๋ด ์๋ค.

์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ ๊ณผ์ ์ ์ฌ๋์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ปดํจํฐ์ ์ ๋ฌํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋๋ก ๋ณํํด ์ฃผ์ด์ผ ํ๋๋ฐ์. ์ฌ๊ธฐ์ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ์ค๊ฐ ํํ์ ์ฝ๋๊ฐ ๋ฐ๋ก **๋ฐ์ดํธ ์ฝ๋(Bytecode)**์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ณํ ๊ณผ์ ์ ์ปดํ์ผ์ด๋ผ ๋ถ๋ฆ ๋๋ค.
๋ฐ์ดํธ ์ฝ๋๋ ๊ณ ์์ค์ ์ธ์ด(์๋ฐ์คํฌ๋ฆฝํธ)์ ๊ธฐ๊ณ์ด(์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ์ฝ๋)์ ์ค๊ฐ ๋จ๊ณ์ ์์นํ๋ ์ฝ๋๋ก, ์คํ ์๋๋ฅผ ๋์ด๋ฉด์๋ ์ ์ฐ์ฑ์ ์ ์งํ ์ ์๋๋ก ํฉ๋๋ค. ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์๋ JIT(Just-In-Time) ์ปดํ์ผ์ ํ์ฉํ์ฌ ์คํ ์ค์ ๋ฐ์ดํธ ์ฝ๋๊ฐ ๋ค์ดํฐ๋ธ ์ฝ๋(๊ธฐ๊ณ์ด)๋ก ๋ณํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋๋ ์ฝ๋๋ฅผ ์ต์ ํํ๊ณ , ์คํ ์๋๋ฅผ ๊ทน๋ํํ ์ ์์ต๋๋ค.
3. ์คํ(Execution)
์ปดํ์ผ์ด ์๋ฃ๋ ๋ฐ์ดํธ ์ฝ๋๋ ์คํ ๋จ๊ณ์์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์คํ์ด ์์๋๋ฉด ์คํ ์ปจํ ์คํธ(Execution Context)๊ฐ ์์ฑ๋๋ฉฐ, ๋ณ์ ํ ๋น, ํจ์ ํธ์ถ, ์ฐ์ฐ ์ํ ๋ฑ์ด ์ด๋ฃจ์ด์ง๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฝ ์คํ(Call Stack)์ ํ์ฉํ์ฌ ์คํ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ํจ์๊ฐ ํธ์ถ๋๋ฉด ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ์คํ์ ์ถ๊ฐ๋๊ณ , ์คํ์ด ์๋ฃ๋๋ฉด ์ ๊ฑฐ๋๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ ์คํ ์ค์ธ ํจ์์ ์คํ์ด ๋๋ ํจ์๋ฅผ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
function sayHello() {
console.log("Hello, world!");
}
sayHello();
์ ์ฝ๋๊ฐ ์คํ๋๋ฉด sayHello ํจ์๊ฐ ํธ์ถ๋๊ณ , ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค. ํจ์ ์คํ์ด ๋๋๋ฉด ํด๋น ์ปจํ ์คํธ๊ฐ ์ ๊ฑฐ๋๊ณ , ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ฉ๋๋ค.
์คํ ๋จ๊ณ์์๋ ๋ณ์์ ํจ์์ ์ค์ฝํ(Scope)๊ฐ ๊ฒฐ์ ๋๋ฉฐ, ํด๋ก์ (Closure)์ ๊ฐ์ ๊ฐ๋ ์ด ์ ์ฉ๋ฉ๋๋ค. ๋ํ ์คํ ์ปจํ ์คํธ ๋ด๋ถ์์ ํธ์ด์คํ (Hoisting)์ด ๋ฐ์ํ์ฌ, ์ ์ธ๋ ํจ์๋ ๋ณ์๊ฐ ์ฝ๋ ์คํ ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฏธ๋ฆฌ ํ ๋น๋ฉ๋๋ค.
์คํ ์ปจํ ์คํธ๋?
์ด์ ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ๋ณด๋ค ๊น์ด ์ดํดํ๊ธฐ ์ํด โ์คํ ์ปจํ ์คํธ(Execution Context)โ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์คํ ์ปจํ ์คํธ๋ ์ฝ๋๊ฐ ์คํ๋ ๋ ์์ฑ๋๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋ณ์, ํจ์, ๊ฐ์ฒด ๋ฑ์ ์คํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ ์ดํ๋ ์ญํ ์ ํฉ๋๋ค. ์คํ ์ปจํ ์คํธ๋ฅผ ์ดํดํ๋ฉด ํจ์ ํธ์ถ์ ํ๋ฆ์ ๋ช ํํ๊ฒ ์ ์ ์์ผ๋ฉฐ, ํธ์ด์คํ , ์ค์ฝํ ์ฒด์ธ, ํด๋ก์ ์ ๊ฐ์ ๊ฐ๋ ๋ ์์ฐ์ค๋ฝ๊ฒ ํ์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ๋ ๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ๋ฐฉ์์์ ํต์ฌ์ ์ธ ๋ถ๋ถ์ด๋ฏ๋ก, ์คํ ์ปจํ ์คํธ๋ฅผ ์ ์ดํดํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
1. ์ฝ์คํ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ ์คํ(Call Stack)์ ์ด์ฉํด ์คํ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ฝ ์คํ์ ํจ์ ์คํ ์์๋ฅผ ์ถ์ ํ๋ LIFO(Last In, First Out) ๊ตฌ์กฐ๋ก ๋์ํฉ๋๋ค. ์ฆ, ๊ฐ์ฅ ๋ง์ง๋ง์ ํธ์ถ๋ ํจ์๊ฐ ๋จผ์ ์คํ๋๋ฉฐ, ์คํ์ด ์๋ฃ๋๋ฉด ์ฝ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณผ๊ฒ์.
function first() {
second();
console.log("ํจ์1");
}
function second() {
third();
console.log("ํจ์2");
}
function third() {
console.log("ํจ์3");
}
first();
์ ์ฝ๋๊ฐ ์คํ๋๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ํจ์ ํธ์ถ ์์์ ๋ฐ๋ผ ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์ ์์๋ค๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.

first()
ํจ์๊ฐ ํธ์ถ๋๋ฉด ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค.first()
ํจ์ ๋ด๋ถ์์second()
ํจ์๊ฐ ํธ์ถ๋๋ฏ๋ก ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.second()
ํจ์ ๋ด๋ถ์์third()
ํจ์๊ฐ ํธ์ถ๋๋ฏ๋ก ๋ ๋ค๋ฅธ ์คํ ์ปจํ ์คํธ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.third()
ํจ์๊ฐ ์คํ๋๋ฉด์ "ํจ์3"์ด ์ถ๋ ฅ๋ ํ,third()
ํจ์์ ์คํ์ด ์ข ๋ฃ๋๋ฉด์ ํด๋น ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.second()
ํจ์๋ก ๋์์ "ํจ์2"๊ฐ ์ถ๋ ฅ๋ ํ,second()
ํจ์์ ์คํ์ด ์ข ๋ฃ๋๋ฉด์ ์คํ ์ปจํ ์คํธ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.- ๋ง์ง๋ง์ผ๋ก
first()
ํจ์์ "ํจ์1"์ด ์ถ๋ ฅ๋ ํ,first()
ํจ์์ ์คํ์ด ์ข ๋ฃ๋๋ฉด์ ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
์ด์ฒ๋ผ ์ฝ ์คํ์ ํจ์ ์คํ ์์๋ฅผ ๊ด๋ฆฌํ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
2. ์คํ ์ปจํ ์คํธ์ ์ข ๋ฅ
์๋ฐ์คํฌ๋ฆฝํธ์์ ์คํ ์ปจํ ์คํธ๋ ์คํ๋๋ ์ฝ๋์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์์ฑ๋ฉ๋๋ค. ํฌ๊ฒ ๋ ๊ฐ์ง ์คํ ์ปจํ ์คํธ๊ฐ ์กด์ฌํ๋๋ฐ์, ํ๋์ฉ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ ์ ์ญ ์คํ ์ปจํ ์คํธ(Global Execution Context)์ ๋๋ค. ์ฝ๋๊ฐ ์ฒ์ ์คํ๋ ๋ ์์ฑ๋๋ฉฐ, window ๋๋ global ๊ฐ์ฒด๊ฐ ํฌํจ๋ฉ๋๋ค. ์ ์ญ ์คํ ์ปจํ ์คํธ๋ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋๊น์ง ์ฝ ์คํ์ ์ ์ง๋ฉ๋๋ค.
๋ ๋ฒ์งธ๋ ํจ์ ์คํ ์ปจํ ์คํธ(Function Execution Context)์ ๋๋ค. ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์์ฑ๋๋ฉฐ, ํจ์ ๋ด๋ถ์ ๋ณ์์ ์คํ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค. ๊ฐ ํจ์๋ ์คํ๋ ๋๋ง๋ค ์๋ก์ด ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๋ฉฐ, ์คํ์ด ๋๋๋ฉด ํด๋น ์ปจํ ์คํธ๋ ์ฝ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ์ญ ์คํ ์ปจํ ์คํธ์ ํจ์ ์คํ ์ปจํ ์คํธ๊ฐ ์ด๋ป๊ฒ ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
let globalVar = "์ ์ญ ๋ณ์";
function greet() {
let message = "์๋
ํ์ธ์";
console.log(message);
}
greet();
์ด ์ฝ๋๊ฐ ์คํ๋๋ฉด, ์คํ ์ปจํ ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ์งํ๋ฉ๋๋ค.

- ์ฝ๋๊ฐ ์คํ๋๋ฉด ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด๋ globalVar ๋ณ์๊ฐ ์ ์ญ ์คํ ์ปจํ ์คํธ์ ํฌํจ๋ฉ๋๋ค.
greet()
ํจ์๊ฐ ํธ์ถ๋๋ฉด ์๋ก์ด ํจ์ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋์ด ์ฝ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค. ์ด ์คํ ์ปจํ ์คํธ์๋message
๋ณ์๊ฐ ํฌํจ๋ฉ๋๋ค.console.log(message)
๊ฐ ์คํ๋๋ฉด์ "์๋ ํ์ธ์"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.greet()
์คํ์ด ์ข ๋ฃ๋๋ฉด ํด๋น ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.- ์ฝ๋๊ฐ ์ข ๋ฃ๋๋ฉด ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
์ด์ฒ๋ผ ์คํ ์ปจํ ์คํธ๋ ์ฝ๋๊ฐ ์คํ๋ ๋๋ง๋ค ์์ฑ๋๋ฉฐ, ์คํ์ด ๋๋๋ฉด ์ฌ๋ผ์ง๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ๊ทธ๋ฆผ์์ ๋ณผ ์ ์๋ฏ์ด, ์ฝ๋๊ฐ ์์๋ ๋ ์์ฑ๋๊ณ ์ ์ญ ๊ณต๊ฐ์ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์ปจํ ์คํธ๋ฅผ โ์ ์ญ ์คํ ์ปจํ ์คํธโ, ํจ์๊ฐ ํธ์ถ๋ ๋ ์์ฑ๋๋ ์ปจํ ์คํธ๋ฅผ โํจ์ ์คํ ์ปจํ ์คํธโ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ์คํ ์ปจํ ์คํธ๋ ์ด๋ค ๊ณผ์ ์ผ๋ก ์์ฑ๋๊ณ ์ข ๋ฃ๋ ๊น์?
3. ์คํ ์ปจํ ์คํธ์ ์์ฑ๊ณผ ์ข ๋ฃ
์คํ ์ปจํ ์คํธ๋ ์ฝ๋๊ฐ ์คํ๋ ๋ ์๋์ผ๋ก ์์ฑ๋๋ฉฐ, ํฌ๊ฒ ์ธ ๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค.
๋จผ์ ์์ฑ ๋จ๊ณ์์ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํํ ์ฝ๋์ ํ๊ฒฝ์ ์ค์ ํฉ๋๋ค. ์ด๋ this
๋ฐ์ธ๋ฉ์ด ๊ฒฐ์ ๋๋ฉฐ, ์คํํ ์ฝ๋๊ฐ ์ ์ญ ์ฝ๋์ธ์ง ํจ์ ์ฝ๋์ธ์ง ํ๋จ๋ฉ๋๋ค. ๋ํ ๋ณ์์ ํจ์ ์ ์ธ์ ์ํ ๊ณต๊ฐ์ด ๋ฏธ๋ฆฌ ํ๋ณด๋๊ณ , ๋ณ์๊ฐ ์์ง ์ด๊ธฐํ๋์ง ์๊ณ ์กด์ฌ๋ง ๋ฑ๋ก๋ฉ๋๋ค.
์ดํ ์ด๊ธฐํ ๋จ๊ณ์์๋ ์์ฑ ๋จ๊ณ์์ ๋ฑ๋ก๋ ๋ณ์์ ํจ์๊ฐ ์ด๊ธฐํ๋ฉ๋๋ค. var๋ก ์ ์ธ๋ ๋ณ์๋ undefined
๋ก ์ด๊ธฐํ๋๊ณ , ํจ์ ์ ์ธ๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ฉ๋๋ค. ์ด ๋จ๊ณ์์ ๋ณ์์ ํจ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋์ง๋ง, ์ค์ ๊ฐ์ด ํ ๋น๋์ง๋ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์คํ ๋จ๊ณ์์๋ ์ฝ๋๊ฐ ์ค์ ๋ก ์คํ๋๋ฉด์ ๋ณ์์ ๊ฐ์ด ํ ๋น๋๊ณ , ์ฐ์ฐ์ด ์ํ๋๋ฉฐ, ํจ์๊ฐ ์คํ๋ฉ๋๋ค. ์คํ์ด ์๋ฃ๋๋ฉด ์คํ ์ปจํ ์คํธ๋ ์ฝ์คํ์์ ์ ๊ฑฐ๋๋ฉฐ, ํ๋ก๊ทธ๋จ์ ๋ค์ ์คํ ์ปจํ ์คํธ๋ก ์งํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ ์ฝ๋๊ฐ ์คํ๋ ๋ ์คํ ์ปจํ ์คํธ๊ฐ ์ด๋ป๊ฒ ์์ฑ๋๊ณ ์ข ๋ฃ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
function sayHello() {
let text = "Hello, world!";
console.log(text);
}
sayHello();
์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋จผ์ sayHello()
ํจ์๊ฐ ํธ์ถ๋๋ฉด์ ์๋ก์ด ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ฉ๋๋ค. ์์ฑ ๋จ๊ณ์์ text
๋ณ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ๋ก๋์ง๋ง, ์์ง ๊ฐ์ด ํ ๋น๋์ง ์์ต๋๋ค. ๊ทธ๋ค์ ์ด๊ธฐํ ๋จ๊ณ์์ text
๋ณ์๋ undefined
๋ก ์ด๊ธฐํ๋ฉ๋๋ค. ์คํ ๋จ๊ณ์์ text
๋ณ์์ โHello, world!โ๊ฐ ํ ๋น๋๊ณ , console.log(text);
๊ฐ ์คํ๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก๋ sayHello()
ํจ์ ์คํ์ด ์ข
๋ฃ๋๋ฉด์ ์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
์ด์ฒ๋ผ ์คํ ์ปจํ
์คํธ๋ ์์ฑ, ์ด๊ธฐํ, ์คํ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉด์ ์ฝ๋์ ํ๋ฆ์ ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ฅผ ์ดํดํ๋ฉด ๋ณ์์ ์ค์ฝํ, ํธ์ด์คํ
, this
๋ฐ์ธ๋ฉ ๋ฑ์ ๊ฐ๋
๋ ๋์ฑ ์ฝ๊ฒ ํ์
ํ ์ ์์ต๋๋ค.
์คํ ์ปจํ ์คํธ์ ๋ด๋ถ ๊ตฌ์กฐ
์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ฉด, ๋ด๋ถ์ ์ผ๋ก ๋ณ์ ํ๊ฒฝ(Variable Environment)๊ณผ ๋ ์์ปฌ ํ๊ฒฝ(Lexical Environment)์ด ํจ๊ป ์์ฑ๋ฉ๋๋ค. ์ด ๋ ๊ฐ์ง ๊ฐ๋ ์ ๋ณ์์ ํจ์ ์ ์ธ์ ๊ด๋ฆฌํ๋ฉฐ, ์คํ ์ค์ธ ์ฝ๋์ ์ค์ฝํ๋ฅผ ๊ฒฐ์ ํ๋ ์ค์ํ ์์์ ๋๋ค. ์ด๋ฅผ ์ดํดํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ณ์๊ฐ ์ด๋ป๊ฒ ์ ์ฅ๋๊ณ ๊ฒ์๋๋์ง, ๊ทธ๋ฆฌ๊ณ ํด๋ก์ (Closure)๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ช ํํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.

1. ๋ณ์ ํ๊ฒฝ(Variable Environment)
๋ณ์ ํ๊ฒฝ(Variable Environment)์ ์คํ ์ปจํ
์คํธ์์ ์ ์ธ๋ ๋ณ์, ํจ์ ์ ์ธ, this
๋ฐ์ธ๋ฉ ์ ๋ณด ๋ฑ์ ํฌํจํ๋ ๊ณต๊ฐ์
๋๋ค. ์ฌ์ค ๋ณ์ ํ๊ฒฝ์ ๋ ์์ปฌ ํ๊ฒฝ(Lexical Environment)๊ณผ ๊ตฌ์กฐ๊ฐ ๋์ผํ์ง๋ง, ๋จ์ํ ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๋ถ๋ถ๋ง์ ๊ด๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
๋ณ์ ํ๊ฒฝ์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋ ์ค ํ๋๋ ํธ์ด์คํ (Hoisting) ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋ณ์ ์ ์ธ์ด ์ฝ๋์ ์คํ ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฏธ๋ฆฌ ์ ์ฅ๋๋๋ฐ์, ์ด ๊ณผ์ ์ด ๋ฐ๋ก ํธ์ด์คํ ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์คํ ์ ์ ๋ณ์ ์ ์ธ์ด ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ์ ์ ์์ต๋๋ค.
console.log(name); // undefined
var name = "JavaScript";
console.log(name); // "JavaScript"
์ ์ฝ๋์์๋ name ๋ณ์๋ฅผ ์ ์ธํ๊ธฐ ์ ์ console.log(name);
์ ์คํํ๋๋ฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ณ undefined
๊ฐ ์ถ๋ ฅ๋๋๋ฐ์, ์ด ์ด์ ๋ var
๋ก ์ ์ธ๋ ๋ณ์๊ฐ ์คํ ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ๋ก๋์ง๋ง, ์ด๊ธฐํ๋์ง ์๊ณ undefined
๋ก ์ค์ ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ฉด, let๊ณผ const๋ก ์ ์ธ๋ ๋ณ์๋ ์คํ ์ ์ ์ด๊ธฐํ๋์ง ์์ผ๋ฏ๋ก ์ ์ธ ์ ์ ์ ๊ทผํ๋ฉด ReferenceError
๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ฌํ ํ์์ TDZ(Temporal Dead Zone, ์ผ์์ ์ฌ๊ฐ์ง๋) ๋ผ๊ณ ํฉ๋๋ค.
๋ํ ๋ณ์ ํ๊ฒฝ์๋ this
๋ฐ์ธ๋ฉ ์ ๋ณด๋ ํฌํจ๋ฉ๋๋ค. ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ ๋, this
๊ฐ ์ด๋ค ๊ฐ์ ๊ฐ๋ฆฌํฌ์ง๊ฐ ๊ฒฐ์ ๋๋๋ฐ์. ์ด๋ ์คํ๋๋ ํ๊ฒฝ(์ ์ญ ๋๋ ํจ์)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ ์ญ ์คํ ์ปจํ
์คํธ์์๋ this
๊ฐ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ window ๊ฐ์ฒด๋ฅผ, Node.js ํ๊ฒฝ์์๋ global ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ํ์ง๋ง ํจ์ ์คํ ์ปจํ
์คํธ์์๋ this
๊ฐ ํจ์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๊ฒฐ์ ๋ฉ๋๋ค.
function showThis() {
console.log(this);
}
const obj = {
method: showThis
};
showThis(); // window
obj.method(); // obj
์ ์ฝ๋์์ showThis
ํจ์๋ ์ผ๋ฐ ํจ์ ํธ์ถ์ผ ๊ฒฝ์ฐ, window(๋ธ๋ผ์ฐ์ )๋ฅผ ๊ฐ๋ฆฌํค์ง๋ง, obj.method()
์ฒ๋ผ ๊ฐ์ฒด์ ๋ฉ์๋๋ก ํธ์ถ๋ ๊ฒฝ์ฐ obj
๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค.
2) ๋ ์์ปฌ ํ๊ฒฝ
๋ ์์ปฌ ํ๊ฒฝ(Lexical ENvironment)์ ๋ณ์ ํ๊ฒฝ๊ณผ ์ ์ฌํ์ง๋ง, ์คํ ์ปจํ ์คํธ์ ์ค์ฝํ(Scope)์ ์ค์ฝํ ์ฒด์ธ(Scope Chain)์ ๊ด๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ ์์ปฌ ์ค์ฝํ(Lexical Scope)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๋ ์์ปฌ ํ๊ฒฝ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ ์์ปฌ ํ๊ฒฝ์ ํ์ฌ ์คํ ์ปจํ ์คํธ์์ ์ ์ธ๋ ๋ณ์, ํจ์, ๋งค๊ฐ๋ณ์ ๋ฑ์ ์ ์ฅํ๋ ๊ฐ์ฒด์ธ ํ๊ฒฝ ๋ ์ฝ๋(Environment Record)์ ํ์ฌ ์คํ ์ปจํ ์คํธ ๋ฐ๊นฅ์ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐํ์ฌ ๋ณ์๋ฅผ ์ฐพ๋ ์ญํ ์ ํ๋ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ(Outer Lexical Environment Reference)์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.

์ฝ๋๋ฅผ ํตํด ์กฐ๊ธ ๋ ์์ธํ๊ฒ ๋ฐฐ์๋ณด๊ฒ ์ต๋๋ค.
function outer() {
let outerVar = "๋ฐ๊นฅ ๋ณ์";
function inner() {
let innerVar = "์์ชฝ ๋ณ์";
console.log(innerVar); // "์์ชฝ ๋ณ์"
console.log(outerVar); // "๋ฐ๊นฅ ๋ณ์"
}
inner();
}
outer();
์ด ์ฝ๋๊ฐ ์คํ๋๋ฉด ๋จผ์ outer
ํจ์๊ฐ ํธ์ถ๋๋ฉด์ ์๋ก์ด ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด ์คํ ์ปจํ
์คํธ์๋ outerVar
๋ณ์๊ฐ ํฌํจ๋๋ฉฐ, ์ด๋ outer ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ์ ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ inner
ํจ์๊ฐ ์คํ๋๋ฉด์ ๋ ๋ค๋ฅธ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๋๋ฐ, ์ด ์คํ ์ปจํ
์คํธ์์๋ innerVar
๋ณ์๊ฐ ์ ์ธ๋๊ณ ์ ์ฅ๋ฉ๋๋ค.

์ฆ, inner
ํจ์๋ ์คํ๋ ๋ ์์ ์ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ฐ์ง์ง๋ง, ๋์์ outer
ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ๋ ์ฐธ์กฐํ ์ ์์ด outerVar
๋ณ์์ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด์ฒ๋ผ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ ์ด์ ๋, ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ฐ๋ผ ์ค์ฝํ ์ฒด์ธ์ ๊ฒ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฌํ ๋งค์ปค๋์ฆ์ ํ์ฉํ๋ฉด ํด๋ก์ (Closure)๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ผ ํด๋ก์ ์ ๋ํด์๋ ๊ฐ๋จํ๊ฒ ์ดํด๋ณผ๊น์?
ํด๋ก์ ๋ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ๊ณ์ํด์ ๊ธฐ์ตํ๊ณ ์ ๊ทผํ ์ ์๋ ๊ฐ๋ ์ ๋๋ค. ์๋์ ์์ ๋ฅผ ํตํด ์ฝ๊ฒ ์ดํดํด ๋ณด๊ฒ ์ต๋๋ค.
function makeCounter() {
let count = 0;
return function () {
count++;
console.log(count);
};
}
const counter = makeCounter();
counter(); // 1
counter(); // 2
์ ์ฝ๋์์ makeCounter
ํจ์๊ฐ ์คํ๋๋ฉด, count
๋ณ์๋ฅผ ํฌํจํ๋ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ makeCounter
ํจ์๊ฐ ์คํ์ด ๋๋๋ฉด์ ์คํ ์ปจํ
์คํธ๋ ์ ๊ฑฐ๋์ง๋ง, ๋ฐํ๋ ๋ด๋ถ ํจ์๋ ์ฌ์ ํ count
๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์๋ํ๋ฉด, ๋ด๋ถ ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ์ด ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฆ, ํด๋ก์ ๋ ์คํ ์ปจํ ์คํธ๊ฐ ์ฌ๋ผ์ง ํ์๋ ๋ณ์๋ฅผ ์ ์งํ ์ ์๋๋ก ํด์ฃผ๋ ๊ฐ๋ ฅํ ๊ฐ๋ ์ผ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ํ๋ฅผ ๊ธฐ์ตํ๋ ํจ์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์์ ์์ฃผ ํ์ฉ๋ฉ๋๋ค.
๋ง์น๋ฉฐ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด ํ์ฑ, ์ปดํ์ผ, ์คํ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์ปดํจํฐ์๊ฒ ์ ๋ฌ๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ ์คํ ์ปจํ ์คํธ๋ ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ์ ์ํ๋ ํต์ฌ ๊ฐ๋ ์ผ๋ก ์์ฉํ๋ฉฐ, ์คํ ํ๋ฆ์ ์ ์ดํ๊ณ ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
์คํ ์ปจํ ์คํธ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด ์ค์ฝํ, ํธ์ด์คํ , ํด๋ก์ ๊ฐ์ ์ค์ํ ๊ฐ๋ ์ ๋ณด๋ค ๊น์ด ์๊ฒ ๋ค๋ฃฐ ์ ์์ต๋๋ค. ํนํ ์ฝ๋์ ์คํ ์์๋ฅผ ์ ํํ ํ์ ํ ์ ์์ด ๋๋ฒ๊น ๊ณผ ์ต์ ํ์๋ ํฐ ๋์์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ ์ปจํ ์คํธ๋ฅผ ๊น์ด ์ดํดํ๋ ๊ฒ์ ๋ณด๋ค ์์ ์ ์ด๊ณ , ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ํ์์ ์ธ ์์๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์ ํตํด ๊ฐ๋ฐ์๋ก์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํด ๋ ์ ์ดํดํ๋ ๊ณ๊ธฐ๊ฐ ๋์๊ธธ ๋ฐ๋๋๋ค.