
์๋ฐ์คํฌ๋ฆฝํธ(JavaScript)๋ ์ค๋๋ ์น ์ํ๊ณ๋ฅผ ์์ง์ด๋ ๊ฑฐ๋ํ ์ฌ์ฅ์ด์, ๋ช ์ค์๋ถํ ๊ธ๋ก๋ฒ ํ์ค ์ธ์ด์ ๋๋ค. ํ๋ฉด์ ์์ ๋ฒํผ ํ๋๋ฅผ ์์ง์ด๋ ๊ฒ๋ถํฐ ์๋ฐฑ๋ง ๋ช ์ ํธ๋ํฝ์ ๊ฐ๋นํ๋ ์๋ฒ(Node.js) ๊ตฌ์ถ, ๋ ๋์๊ฐ ๋ชจ๋ฐ์ผ ์ฑ๊ณผ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ทธ ์ํฅ๋ ฅ์ ๊ฒฝ๊ณ๊ฐ ์์ ์ ๋๋ก ์ค์ํ ์ธ์ด์ผ ๊ฒ์ ๋๋ค. ์ํฉ์ด ์ด๋ ๋ค ๋ณด๋, ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ๋ง๋ก ํ๊ณ ์น ๊ฐ๋ฐ์๋ฅผ ๋ชฉํ๋ก ํ๋ ์ ๊ณต์์ ๋น์ ๊ณต์ ํ์๋ค์ ๋ฌผ๋ก , ์ด์ ๋ง ํ์ ์ ๋ฐ์ด๋ ์ ์ ๊ฐ๋ฐ์, ๊ทธ๋ฆฌ๊ณ ์ฐ์ฐจ๊ฐ ์ ์ ์์ฌ ๊ฐ๋ ์ฃผ๋์ด · ๋ฏธ๋ค๊ธ ๊ฐ๋ฐ์๋ค๊น์ง ๋ชจ๋๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ์ก๊ณ ์น์ดํ๊ฒ ์จ๋ฆํ๊ณ ์์ต๋๋ค.
ํ์ง๋ง ์์ด๋ฌ๋ํ๊ฒ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ '๊ฐ์ฅ ๋ฐฐ์ฐ๊ธฐ ์ฌ์ฐ๋ฉด์๋, ๊ฐ์ฅ ๋ง์คํฐํ๊ธฐ ์ด๋ ค์ด ์ธ์ด'๋ก ๊ผฝํ๋๋ค. HTML, CSS์ ๊ฒฐํฉํ์ฌ ๋ช ์ค์ ์ฝ๋๋ง์ผ๋ก๋ ๋์ ๋ณด์ด๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ผ ์ ์์ด ์ง์ ์ฅ๋ฒฝ์ ๋ฎ์ง๋ง, ์ธ์ด์ ๋ด๋ถ ๊น์ํ ๊ณณ์ผ๋ก ๋ค์ด๊ฐ์๋ก ์์์น ๋ชปํ ๊ธฐ์ดํ ๋์๋ค๊ณผ ๋ง์ฃผํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ ํนํ ํ๋กํ ํ์ ๊ธฐ๋ฐ์ ์์, ์คํ ์ปจํ ์คํธ์ ๋ฉ์ปค๋์ฆ, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฅ๊ณ ํ๋๋ ํด๋ก์ , ๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ ๋ฃจํ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊น์ง, ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๋ฉด ์์๋ก ๋ฏธ๊ถ์ ๋น ์ง๊ธฐ ์ฌ์ด ๋ ํนํ ์ค๊ณ ์ฒ ํ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋ง์ ํ์๋ค์ด๋ ์ ์ ๊ฐ๋ฐ์๋ค์ด ๋ฒํ๋ ๊ฐ์ฅ ํฐ ์ค์๋ ํ๋ ์์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(React, Vue, Next.js ๋ฑ)์ ํ๋ คํ ๊ธฐ์ ์ ๋น ๋ฅด๊ฒ ์ตํ๋ ๋ฐ๋ง ๊ธ๊ธํด ์ ์ ๊ทธ ๊ธฐ๋ฐ์ด ๋๋ '๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ(Vanilla JS)'์ ๊ธฐ์ด ์ฒด๋ ฅ์ ์ํํ ํ๋ค๋ ์ ์ ๋๋ค. ๋น์ฅ ๋์์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐ๋ ๋ฌธ์ ๊ฐ ์์์ง ๋ชจ๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ ์ฝ๋์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ณ , ๋ณต์กํ ์ฑ๋ฅ ์ต์ ํ๊ฐ ํ์ํ๋ฉฐ, ์์ธ์ ์ ์ ์๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ ๋ ๊ธฐ์ด๊ฐ ๋ถ์คํ ๊ฐ๋ฐ์๋ ๋ฌด๋์ง ์๋ฐ์ ์์ต๋๋ค. "์๋ฌ๋ ์ ๋๋๋ฐ ์ ํ๋ฉด์ด ์ ์์ง์ด์ง?", "์ ์ด ๋ณ์ ๊ฐ์ด ๊ฐ์๊ธฐ ๋ณํ์ง?"๋ผ๋ ์ง๋ฌธ์ ๋ต์ ๋ด๋ฆฌ์ง ๋ชปํ๊ณ Stack Overflow๋ AI๊ฐ ์ ๊ณตํ๋ ์ฝ๋๋ฅผ ๋ณต์ฌ · ๋ถ์ฌ ๋ฃ๊ธฐ๋ง ํ๋ ์ ์ํ์ ๋น ์ง๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ํ์์ ํ์ ์์ 3~5๋ ๋์ ์น์ดํ๊ฒ ์๋น์ค๋ฅผ ๋ง๋ค์ด์จ ๊ฒฝ๋ ฅ์ง ๊ฐ๋ฐ์๋ค์๊ฒ๋ ์ฐพ์์ฌ ์ ์์ต๋๋ค. ์ด๋ฅธ๋ฐ '์ฃผ๋์ด ๋ ๋ฒจ์ ์ ์ฒด๊ธฐ'์ ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฃจ๋ ์๋ จ๋๋ ๋์์ก์ง๋ง, ๋ฉด์ ์ด๋ ๊ธฐ์ ๋ฉด์ ์์ ์ธ์ด ๋ณธ์ฐ์ ๋์ ์๋ฆฌ๋ฅผ ๋ฌป๋ ์ง๋ฌธ(์: ์คํ ์ปจํ ์คํธ์ ํธ์ด์คํ ์ ๊ด๊ณ๋ฅผ ์ค๋ช ํด ์ฃผ์ธ์.)์ ๋ฐ์ผ๋ฉด ๋ง๋ฌธ์ด ๋งํ๊ณค ํฉ๋๋ค. ์ด ์ ์ฒด๊ธฐ๋ฅผ ๋ซ๊ณ ์๋์ด ๊ฐ๋ฐ์๋ก ๋์ฝํ๊ธฐ ์ํด ํ์ํ ์ ์ผํ ์ด์ ์ญ์, ๊ฒฐ๊ตญ์ ์๋ฐ์คํฌ๋ฆฝํธ์ '๊ธฐ๋ณธ๊ธฐ'๋ฅผ ๋ค์ ์ ๊ตํ๊ฒ ๋ค๋ฌ๋ ์ผ์ ๋๋ค.
๋ณธ ์ฐ์ฌ ์๋ฆฌ์ฆ๋ ๋ฐ๋ก ์ด๋ฌํ ๊ณ ๋ฏผ์ ์๊ณ ์๋ ๋ชจ๋ ์ด๋ค์ ์ํด ์ค๋นํ์ต๋๋ค. ์ด์ ๋ง ์ฒซ ๊ฑธ์์ ๋ผ๋ ํ์๋ค์๊ฒ๋ ๋จ๋จํ ์ด์ ํ๊ฐ ๋๊ณ , ํ์ ์์ ๊ณ ๊ตฐ๋ถํฌํ๋ ๊ฐ๋ฐ์๋ค์๊ฒ๋ ์์ ์ ์ง์์ ์ฌ์ ๋นํ๊ณ ํ ๋จ๊ณ ๋์ฝํ ์ ์๋ ๋๋ค๋์ด ๋๊ณ ์ ํฉ๋๋ค.
์คํ ์ปจํ ์คํธ(Execution Context)์ ๋ณ์์ ์๋ช ์ฃผ๊ธฐ(Hoisting/TDZ)
์ฐ๋ฆฌ๊ฐ ์ฌ๋ฌ IDE์ ์์ฑํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ๋ธ๋ผ์ฐ์ ๋ Node.js ํ๊ฒฝ์์ ์ด๋ป๊ฒ ์ธ์๋๊ณ ์คํ๋ ๊น์? ๋จ์ํ ์ฝ๋๊ฐ ์์์ ์๋๋ก ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์ค์ฉ ์ฝํ๋ค๊ณ ์๊ฐํ๋ค๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ง์ '๊ธฐ์ดํ ํ์(์ ์ธ ์ ์ ๋ณ์๋ฅผ ํธ์ถํ๋ ํธ์ด์คํ )'์ ์ ๋ ์ดํดํ ์ ์์ต๋๋ค.
์คํ ์ปจํ ์คํธ(Execution Context)๋ ๋ฌด์์ธ๊ฐ?
๐ ์คํ ์ปจํ ์คํธ๋?
์ฐ๋ฆฌ๊ฐ ๋ง์๋ ์์์ ๋ง๋ค๊ธฐ ์ํด์ ์๋ฆฌํ๋ค๊ณ ๊ฐ์ ํด ๋ด ๋๋ค. ์๋ฆฌ๋ฅผ ํ๋ ค๋ฉด ๋ ์ํผ(์ฝ๋)๋ง ์์ด์๋ ์๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค. ์๋ฆฌ๋ฅผ ์ํ ๋๊ตฌ์ ์์ ์ฌ๋ฃ๋ค์ด ์ค๋น๋์ด์ผ ํ๊ณ , ์๋ฆฌ๋ฅผ ํ ์ ์๋ ๊ณต๊ฐ์ด ํ์ํฉ๋๋ค. ์ฌ๊ธฐ์ ๊ณต๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์คํ ์ปจํ ์คํธ๋ผ๊ณ ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ํด ํ์ํ ์ฌ๋ฐฉ์ ๋ชจ๋ ์ ๋ณด(๋ณ์, ํจ์ ์ ์ธ, ์ค์ฝํ, this ๋ฑ)๋ฅผ ๋ด๊ณ ์๋ ํ๊ฒฝ์ด์ ๊ฐ์ฒด.
์คํ ์ปจํ ์คํธ์ 3๊ฐ์ง ์ข ๋ฅ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ํ ์ค ํ์ค ์ฝ์ด ๋ด๋ ค๊ฐ๋ฉด์ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ญ๋ณ๋ก ์์ฑํฉ๋๋ค. ํด๋น ์์ญ์ '์ ์ญ ์ปจํ ์คํธ(Global Execution Context)', 'ํจ์ ์ปจํ ์คํธ(Function Execution Context)', 'Eval ํจ์ ์ปจํ ์คํธ(๋ณด์ ๋ฐ ์ฑ๋ฅ ๋ฌธ์ ๋ก ๊ฑฐ์ ์ฌ์ฉ ์ ํจ)' 3๊ฐ์ง ์ข ๋ฅ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
๋ฐฑ๋ฌธ์ด ๋ถ์ฌ์ผ๊ฒฌ์ด์ฃ . ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ์ฝ๋์์ ๊ฐ๊ฐ์ ์ปจํ ์คํธ๊ฐ ์ด๋ป๊ฒ ์์ฑ๋๊ณ ๊ตฌํ๋๋์ง ํ์ธํด ๋ด ์๋ค.
์์ค ํ์ธ
// ===================================================
// 1. ์ ์ญ ์คํ ์ปจํ
์คํธ (Global Execution Context)
// ํจ์ ๋ฐ๊นฅ์ ์๋ ํด๋น ๊ณต๊ฐ ์์ฒด๊ฐ '์ ์ญ ์ปจํ
์คํธ' ์์ญ์
๋๋ค.
// ํ๋ก๊ทธ๋จ์ด ์์๋์๋ง์ ๋จ ํ๋๋ง ์์ฑ๋๋ฉฐ, window(๋ธ๋ผ์ฐ์ ) ๋๋ global(Node.js) ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
// ===================================================
const globalSubject = "์๋ฐ์คํฌ๋ฆฝํธ ์คํ ์ปจํ
์คํธ";
console.log("์ ์ญ ์ปจํ
์คํธ ์คํ ์ค :", globalSubject);
// ===================================================
// 2. ํจ์ ์คํ ์ปจํ
์คํธ (Function Execution Context)
// ํจ์๊ฐ '์ ์ธ' ๋ ๋๊ฐ ์๋๋ผ, ์ค์ 'ํธ์ถ(Execution)'๋ ๋๋ง๋ค ๊ฐ๊ฐ์
// ๋
๋ฆฝ์ ์ธ ํจ์ ์ปจํ
์คํธ๊ฐ ์๋กญ๊ฒ ์์ฑ๋๋ค.
// ===================================================
function printSubject(subject){
// printSubject ํจ์ ์ปจํ
์คํธ ์์ญ ์์์ผ๋ก ์ ์ญ ๋ณ์์ ๊ฒฉ๋ฆฌ๋ ์ง์ญ ๋งค๊ฐ๋ณ์(subject)์
// ์ง์ญ ๋ณ์(status)๋ฅผ ๊ฐ์ง๋ค.
const status = "์งํ!";
console.log(`${subject} ํ์ฌ ${status}`);
}
// ํด๋น ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ์ฝ ์คํ์ ์๋ก์ด ๋ฐฉ์ด ๋ง๋ค์ด์ง๋ค.
printSubject("์คํ ์ปจํ
์คํธ ๊ณต๋ถ"); // printSubject ํจ์ ์ปจํ
์คํธ ์์ฑ
// ===================================================
// 3. Eval ํจ์ ์คํ ์ปจํ
์คํธ (Eval Execution Context)
// ๋ฌธ์๋ก ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ์คํํ ๋ ์์ฑ๋๋ ๋
ํนํ ์ปจํ
์คํธ์
๋๋ค.
// ๋ณ์ ์ค์ฝํ๋ฅผ ๋ฐํ์์ ์ค์ผ์ํค๊ณ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ ค ์ฌ์ฉํ์ง ์์ต๋๋ค.
// ===================================================
const code = "var dynamic = '๋ณด์ ์ํ!'; console.log(dynamic)";
// eval() ํจ์๊ฐ ์คํ๋๋ ์๊ฐ, ์ผ๋ฐ ํจ์์๋ ๋ค๋ฅธ ๋ณ๋์ Eval ์ปจํ
์คํธ๊ฐ ๋ง๋ค์ด์ง๋ค.
eval(code);
์ ์์ค๋ฅผ ํตํด์ ์ฐ๋ฆฌ๊ฐ ์ง๊ณ ๋์ด๊ฐ์ผ ํ ํต์ฌ ๋ด์ฉ์ด 3๊ฐ์ง ์กด์ฌํฉ๋๋ค. ํ์ธํด ๋ณด์ฃ .
1. ์ ์ธ๊ณผ ์คํ์ ํ์ด๋ฐ ๋ถ๋ฆฌ
์ ์์ค์์ function printSubject()๋ฅผ ์์ฑํ ์๊ฐ์๋ ํจ์ ์ปจํ ์คํธ๊ฐ ๋ง๋ค์ด์ง์ง ์์ต๋๋ค. ์์ง์ ๊ทธ์ ์ ์ญ ์ปจํ ์คํธ ๋ด์ญ์ "printSubject ๋ผ๋ ํจ์๊ฐ ์กด์ฌํ๋ค." ๋ผ๊ณ ์ด๋ฆ๋ง ์ ์ด๋ ์ ์ด์ฃ . ์ค์ ํจ์ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ ์์ ์ ๋งจ ์๋์์ printSubject("์คํ ์ปจํ ์คํธ ๊ณต๋ถ")๋ผ๊ณ ๊ดํธ๋ฅผ ๋ถ์ฌ ํธ์ถํ๋ ์๊ฐ์ ๋๋ค.
2. ๋ ๋ฆฝ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ (ํจ์ ์ปจํ ์คํธ์ ํน์ง)
printSubject ๋ด๋ถ์ status ๋ณ์๋ ํจ์ ์ปจํ ์คํธ๊ฐ ์ผ์ง ๋ ํ์ด๋ฌ๋ค๊ฐ, ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด(์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์์ ์ฌ๋ผ์ง๋ฉด) ํจ๊ป ๋ฉ๋ชจ๋ฆฌ์์ ์์ ํ ์๋ฉธํฉ๋๋ค. ์ ์ญ ์ปจํ ์คํธ์ ์๋ globalSubject ๋ณ์๋ ํ๋ก๊ทธ๋จ์ด ๊บผ์ง ๋๊น์ง ๊ณ์ ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์์ต๋๋ค. ์ด๊ฒ์ด ์ ์ญ ๋ณ์๋ฅผ ๋จ๋ฐํ๋ฉด ์ ๋๋ ์ด์ ์ ๋๋ค.
3. ์ Eval ์ปจํ ์คํธ๋ ์ฐ๋ฉด ์ ๋ ๊น?
eval() ์ ๋ฌธ์์ด์ ์ฝ๋๋ก ๋ฐ๊ฟ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ปดํ์ผ์ ํด๋๋๋ฐ, eval์ ์ฐ๋ฉด ์ค๊ฐ์ ์ด๋ค ์ฝ๋๊ฐ ํ์ด๋์ฌ์ง ์ ์ ์์ด ์์ง์ ์ต์ ํ ์์ ์ ์ ๋ถ ๋ง๊ฐ๋จ๋ฆด ์ ์์ต๋๋ค. ๋๋ถ์ด ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์ฃผ์ ๋ ์ ์๋ ์น๋ช ์ ์ธ ๋ณด์ ๊ตฌ๋ฉ์ด ๋ ์ ์์ต๋๋ค.
์ฝ ์คํ(Call Stack)๊ณผ ์ปจํ ์คํธ์ ์ํ
์๋ฐ์คํฌ๋ฆฝํธ๋ '์ฑ๊ธ ์ค๋ ๋' ์ธ์ด์ ๋๋ค. ํ ๋ฒ์ ํ๋์ ์ผ๋ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ฌ๋ฌ ์ปจํ ์คํธ๊ฐ ์์ฑ๋ ๋, ์ด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฝ ์คํ(Call Stack)์ด๋ผ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. (Stack์ ๋ฐ์ด ๋งํ ํญ์๋ฆฌ๋ผ๊ณ ์๊ฐํ๊ณ ๋จผ์ ๋ค์ด๊ฐ ๊ฒ ๋์ค์ ๋์ค๋ ๊ตฌ์กฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.)
๊ฐ๋จํ ์์ค๋ฅผ ๋ณด๋ฉด์ ์ฝ ์คํ ์์์ ๋ํด์ ํ์ธํด ๋ด ์๋ค.
์์ค ํ์ธ
// (1) ์ ์ญ ์ฝ๋ ์์
let topGlobal = "Top Global";
function myMethod(){
// (3) myMethod ํจ์ ์คํ
function myInnerMethod(){
// (5) myInnerMethod() ์คํ
}
myInnerMethod(); // (4) myInnerMethod() ํธ์ถ
}
myMethod(); // (2) myMethod ํธ์ถ
์ ์์ค๋ฅผ ํตํด ์์ง์ ๋ด๋ถ ์์ง์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฝ๋๊ฐ ์คํ๋์๋ง์ ํญ์๋ฆฌ ๋งจ ๋ฐ๋ฐ๋ฅ์ ์ ์ญ ์ปจํ ์คํธ์ธ topGlobal์ด ๊น๋ฆฝ๋๋ค. myMethod() ํธ์ถ๋ฌธ์ ๋ง๋๋ฉด, ์์ง์ ํ๋ ์ผ์ ๋ฉ์ถ๊ณ myMethod ํจ์ ์ปจํ ์คํธ๋ฅผ ์์ฑํด ์ ์ญ ์ปจํ ์คํธ ์์ ์น์ต๋๋ค. myMethod ์์์ myInnerMethod() ํธ์ถ๋ฌธ์ ๋ง๋๋ฉด ๋ ๊ทธ์์ myInnerMethod ํจ์ ์ปจํ ์คํธ๋ฅผ ์น์ต๋๋ค (ํ์ฌ ์คํ ์ค์ธ ์ปจํ ์คํธ๋ ํญ์๋ฆฌ ์ ์ฅ์์ ๋ณด๋ฉด์ ํญ์ ๋งจ ์์ ์ฌ๋ ค์ ธ ์๋ ๊ฒ์ด์ฃ ). myInnerMethod ํจ์๊ฐ ๋๋๋ฉด ์คํ์์ myInnerMethod๊ฐ ํ(Pop)๋์ด ์ฌ๋ผ์ง๋๋ค. ์ด์ด์ myMethod ํจ์๊ฐ ๋๋๋ฉด myMethod๊ฐ ์ฌ๋ผ์ง๊ณ , ๋ง์ง๋ง์ผ๋ก ์ ์ญ ์ฝ๋๊น์ง ๋๋๋ฉด ์ฝ ์คํ์ ์์ ํ ๋น์์ง๊ฒ ๋ฉ๋๋ค.
| myInnerMethod() myMethod() topGlobal |
myMethod() topGlobal |
topGlobal |
๋ณ์์ ์๋ช ์ฃผ๊ธฐ(Variable Lifecycle)๋ ๋ฌด์์ธ๊ฐ?
์คํ ์ปจํ ์คํธ๊ฐ '๊ณต๊ฐ'์ด๋ผ๋ฉด, ๊ทธ ์์ ์ฑ์ฐ๋ ๋ณ์๋ค์ ์ ๋ง๋ค ํ์ด๋๊ณ , ์ฐ์ด๊ณ , ์ฌ๋ผ์ง๋ ์๋ช ์ฃผ๊ธฐ(Lifecycle)๋ฅผ ๊ฐ์ง๋๋ค. ๋ง์ ๊ฐ๋ฐ์๊ฐ ๋ณ์๋ฅผ ๊ทธ์ 'let a = 1;'์ฒ๋ผ ํ ์ค๋ก ์ธ์ํ์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๋ด๋ถ์์๋ ๋ณ์๊ฐ ์์ฑ๋ ๋ ๋ช ํํ 3๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค.
๐โ๏ธ ๋ณ์ ์์ฑ์ 3๋จ๊ณ ํ๋ก์ธ์ค
1. ์ ์ธ ๋จ๊ณ (Declaration Phase)
๋ณ์์ ์ด๋ฆ์ ์คํ ์ปจํ ์คํธ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋์ฅ(ํ๊ฒฝ ๋ ์ฝ๋)์ ๋ฑ๋กํ๋ ๋จ๊ณ์ ๋๋ค. "์์ผ๋ก ์ด๋ฐ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ธ ๊ฑฐ์ผ!"๋ผ๊ณ ์์ง์๊ฒ ์๋ฆฌ๋ ๋จ๊ณ์ ๋๋ค.
2. ์ด๊ธฐํ ๋จ๊ณ (Initialization Phase)
๋ฑ๋ก๋ ๋ณ์๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ , ๊ธฐ๋ณธ๊ฐ์ธ 'undefined'๋ฅผ ์ฑ์ ๋ฃ๋ ๋จ๊ณ์ ๋๋ค. ํด๋น ๋จ๊ณ๊ฐ ์ง๋์ผ ๋น๋ก์ ๋ณ์๋ฅผ ํธ์ถํ์ ๋ ์๋ฌ๊ฐ ๋์ง ์์ต๋๋ค.
3. ํ ๋น ๋จ๊ณ (Assignment Phase)
'undefined'๋ก ์ฑ์์ ธ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ๋ฐ์๊ฐ ์๋ํ ์ค์ ๊ฐ(์: a = 1;)์ ๋ฎ์ด์์ฐ๋ ๋จ๊ณ์ ๋๋ค.
var, let, const
| ํน์ฑ | var | let | const |
| ์ค์ฝํ(Scope) | ํจ์ ๋ ๋ฒจ ์ค์ฝํ(Function) | ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ(Block) | ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ(Block) |
| ๊ฐ ์ฌํ ๋น | ๊ฐ๋ฅ | ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ (์์) |
| ๋ณ์ ์ฌ์ ์ธ | ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ |
| ํธ์ด์คํ ๋์ | ์ ์ธ + ์ด๊ธฐํ(undefined) | ์ ์ธ๋ง ๋จ(TDZ ๋ฐ์) | ์ ์ธ๋ง ๋จ(TDZ ๋ฐ์) |
์ค์ฝํ๋ ๋ณ์๊ฐ ํ์ด๋์ ์ ๊ทผํ ์ ์๋ ํ๋ ์์ญ์ ๋๋ค.
โ var : ํจ์ ๋ ๋ฒจ ์ค์ฝํ (Function-level Scope)
var๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ก ์ ์ญ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ์ง์ญ์ผ๋ก๋ ์ค์ ํ ์ ์๋๋ฐ, ์ค์ง ํจ์์ ๋ธ๋ก('{}')๋ง์ ์ง์ญ ์ค์ฝํ๋ก ์ธ์ ํฉ๋๋ค. ์ฆ, ํจ์ ๋ด๋ถ๊ฐ ์๋๋ผ๋ฉด if๋ฌธ, for๋ฌธ, while๋ฌธ ๋ฑ ์ด๋ค ๋ธ๋ก ์์์ ์ ์ธํ๋๋ผ๋ ๋ชจ๋ ์ ์ญ ๋ณ์๊ฐ ๋์ด ๋ฒ๋ฆฝ๋๋ค.
์์ค ํ์ธ
// ์ ์ญ ๋ณ์ ์ ์ธ
var globalVariable = "global";
if(true){
// ๋ธ๋ก ์์์ ์ ์ธํ์ง๋ง, ์ ์ญ ๋ณ์๊ฐ ๋๋ค.
var totalAmount = 5000;
}
console.log(globalVariable);
console.log(totalAmount);
// ๋ฐ๋ณต๋ฌธ์์ ์ ์ธํ i๋ ์ ์ญ ๋ณ์๊ฐ ๋๋ค.
for(var i = 0; i < 22; i++){
console.log("๋ฐ๋ณต roop : ", i);
}
console.log("๋ฐ๋ณต๋ฌธ์์ ๋ฐ๋ณตํ i : ", i);
function method(){
// ํจ์ ๋ธ๋ก({})์์ ์ ์ธํ ๋ณ์๋ ์ง์ญ๋ณ์๊ฐ ๋๋ค.
var a = 1;
}
console.log(a); // Uncaught ReferenceError: a is not defined ๋ฐ์
globalVariable ๋ณ์๋ ๋ธ๋ก ๋ฐ์ ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ์ญ ๋ณ์๋ก ์ค์ ๋ฉ๋๋ค. ์กฐ๊ฑด๋ฌธ ์์์ ์์ฑ๋ totalAmount๋ var๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ ์ ์ญ ๋ณ์๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ณต๋ฌธ๋ ๋ง์ฐฌ๊ฐ์ง๋ก var๋ก ์ ์ธ๋ ์นด์ดํฐ ๋ณ์ i๊ฐ ๋ฃจํ๊ฐ ๋๋ ํ์๋ ์ ์ญ์ผ๋ก ์ด์๋จ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ก์ง์ ๋ณ์๋ฅผ ์ค์ผ์ํค๋ ์น๋ช ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
์ ์ผํ๊ฒ ํจ์ method์์ ์ ์ธํ 'var a = 1;'์ ์ง์ญ๋ณ์๋ก ์ค์ ๋์ด ์๋ a๋ฅผ ์ถ๋ ฅ ์, ReferencesError( Uncaught ReferencesError: a is not defined)๊ฐ ๋ฐ์ํฉ๋๋ค.
โก let, const : ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ (Block-level Scope)
let, const๋ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ก ์ง์ญ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ํจ์๋ ๋ฌผ๋ก , ๋ชจ๋ ์ฝ๋ ๋ธ๋ก({})์ ์ง์ญ ์ค์ฝํ๋ก ์ธ์ ํฉ๋๋ค. ๋ธ๋ก ๋ด๋ถ์์ ์ ์ธ๋ ๋ณ์๋ ์ค์ง ๊ทธ ๋ธ๋ก ๋ด๋ถ์์๋ง ๋ผ์ดํ ์ฌ์ดํฌ๋ฅผ ๊ฐ์ง๋๋ค. ๋ธ๋ก์ ๋ฒ์ด๋๋ ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์๋ฉธํฉ๋๋ค.
์์ค ํ์ธ
if(true){
let internalValue = "def";
const internalNumber = 100;
console.log(internalValue);
}
// ๋ธ๋ก ์ธ๋ถ์์๋ ๋ด๋ถ ๋ณ์์ ์ ๋ ์ ๊ทผ ๋ถ๊ฐ๋ฅ (์บก์ํ ๋ฐ ๋ณดํธ)
console.log(internalNumber); // ReferencesError: internalNumber is not defined
internalValue์ internalNumber๋ ๋ธ๋ก ๋ด์ ์ ์ธ๋์ด, ํด๋น ๋ธ๋ก ๋ด์์๋ง ์ฌ์ฉํ ์ ์๋ ์ง์ญ ๋ณ์๋ก ์ค์ ๋ฉ๋๋ค. ๋ธ๋ก ๋ฐ์์ ๋ธ๋ก ๋ด์ ์ ์ธ๋ ๋ ๋ณ์ ์ค, internalNumber๋ฅผ ์ถ๋ ฅํ๋ฉด ReferencesError๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ณ์ ์ฌ์ ์ธ๊ณผ ์ฌํ ๋น
์ฝ๋๊ฐ ๋๊ท๋ชจํ๋ ์๋ก ๋ณ์์ ๊ฐ์ด ์ค๊ฐ์ ์๋์น ์๊ฒ ๋ฐ๋๊ฑฐ๋, ์ด๋ฏธ ์กด์ฌํ๋ ๋ณ์ ์ด๋ฆ์ ์ค์๋ก ๋ค์ ์ ์ธํ๋ ์ผ์ด ์์ด์ผ ํฉ๋๋ค.
์์ค ํ์ธ
// โ var : ์ฌ์ ์ธ ๊ฐ๋ฅ, ์ฌํ ๋น ๊ฐ๋ฅ (๋ฌด๋ฒ์ง๋)
var productId = "A-20260518001";
var productId = "B-20260519003"; // ๊ฒฝ๊ณ ์์ด ์ฌ์ ์ธ ๊ฐ๋ฅ(๊ธฐ์กด ๊ฐ ๋ฎ์ด์)
productId = "A-20260514012"; // ์ฌํ ๋น ๊ฐ๋ฅ
โผ๏ธ ์๋ง ์ค์ ํ์
์ฝ๋์์ ๋๊ตฐ๊ฐ ๋ด๊ฐ ๋ง๋ ๋ณ์๋ช
์ ๋ชจ๋ฅด๊ณ var๋ก ๋ ์ ์ธํ๋ค๋ฉด,
๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ์ ์ค๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์๋ฉ๋๋ค.
// โก let : ์ฌ์ ์ธ ๋ถ๊ฐ๋ฅ, ์ฌํ ๋น ๊ฐ๋ฅ (์ ์ฐํ ๋ณ์)
let age = 20;
// let age = 24; // SyntaxError: Identified 'age' has already been declared
age = 30; // ๊ฐ์ ๋ณ๊ฒฝ(์ฌํ ๋น)์ ๊ฐ๋ฅ
// โข const : ์ฌ์ ์ธ ๋ถ๊ฐ๋ฅ, ์ฌํ ๋น ๋ถ๊ฐ๋ฅ (์์ ํ ์์)
const url = "https://example.com";
url = "https://junesker.tistory.com"; // TypeError: Assignment to constant variable
โผ๏ธ const๋ 'Constant(์์)'์ ์ฝ์๋ก, ํ ๋ฒ ์ ์ธํ๋ฉด ์ ๋ ๋ณํ์ง ์๋ ๊ฐ์ ๋ด์ ๋ ์ฌ์ฉํฉ๋๋ค.
๋ฐ๋ผ์ ์ ์ธ๊ณผ ๋์์ ๊ฐ์ ๋ฌด์กฐ๊ฑด ํ ๋น(์ด๊ธฐํ)ํด์ผ ํฉ๋๋ค.
const์ ์ฐธ์กฐ ํ์ (Object, Array)
"const๋ ๊ฐ์ ์ฌํ ๋น ํ ์ ์๋ค."๋ ๋ง์๋ ๊ฐ์ฒด๋ก ๋ณด๋ฉด ํจ์ ์ด ์์ต๋๋ค. ์์ ๊ฐ(์ซ์, ๋ฌธ์์ด ๋ฑ)์ ๋ฐ๊ฟ ์ ์์ง๋ง, ๊ฐ์ฒด(Object)๋ ๋ฐฐ์ด(Array)์ด ํ ๋น๋ ๊ฒฝ์ฐ ๋ด๋ถ์ ํ๋กํผํฐ๋ ์์๋ ์์ ํ ์ ์์ต๋๋ค.
์์ค ํ์ธ
const student = {
name : "kildong",
age : 20
}
// โญ ๊ฐ์ฒด ๋ด๋ถ์ ํ๋กํผํฐ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ ๊ฐ๋ฅ
student.name = "Kilsoon";
student.hobby = "sports";
console.log(student.name);
console.log(student.hobby);
// โ student๋ผ๋ ๋ณ์ ์์ฒด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ฌํ ๋น ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ
// student = {name : "yeong-he"};
const๊ฐ ๋ณด์ฅํ๋ ๊ฒ์ ๋ณ์์ ๋ด๊ธด '๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ(์ฐธ์กฐ๊ฐ)'์ด ๋ณํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฃผ์์ง๊ฐ ๊ฐ๋ฆฌํค๋ ์ค์ ํ(Heap) ๋ฉ๋ชจ๋ฆฌ ๋ด๋ถ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๊น์ง ์ ๊ทธ๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
โ ๏ธ var vs let / const ์๋ช ์ฃผ๊ธฐ์ ๊ฒฐ์ ์ ์ฐจ์ด
๋ณ์ ์์ฑ์ 3๋จ๊ณ(์ ์ธ > ์ด๊ธฐํ > ํ ๋น)๊ฐ ์ด๋ป๊ฒ ๊ฒฐํฉํ๋๋์ ๋ฐ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ ํธ์ด์คํ ๊ณผ TDZ(Temporal Dead Zone) ํ์์ด ๋ฐ์ํฉ๋๋ค.
ํธ์ด์คํ (Hoisting)๊ณผ TDZ(Temporal Dead Zone)
ํธ์ด์คํ (Hoisting)์ด๋ ๋ฌด์์ธ๊ฐ?
๋ง์ ์ฑ ์ด๋ ๊ฐ์์์ ํธ์ด์คํ ์ ๋ํด์ ์ค๋ช ํ๋ ๊ฑธ ๋ณด๋ฉด "๋ณ์์ ํจ์ ์ ์ธ๋ฌธ์ด ์ฝ๋์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ง๋ ํ์"์ด๋ผ๊ณ ์ค๋ช ํฉ๋๋ค. ํ์ง๋ง, ์ค์ ๋ก ์ฝ๋๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์๋ก ์ด๋ํ๋ ๊ฒ์ ์๋๋๋ค.
์ค์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ '์ปดํ์ผ ๋จ๊ณ'๋ฅผ ๊ฑฐ์นฉ๋๋ค. ํด๋น ๋จ๊ณ์์ ์์ง์ ์ฝ๋๋ฅผ ์ญ ํ์ผ๋ฉฐ var, let, const, function๊ณผ ๊ฐ์ ์ ์ธ๋ฌธ๋ค์ ์ฐพ์๋ด ์คํ ์ปจํ ์คํธ์ ํ๊ฒฝ ๋ ์ฝ๋(Environment Record)๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ๋ด์ญ์ ๋จผ์ ๋ฑ๋กํฉ๋๋ค.
์ ์ธ๋ฌธ๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ฏธ ๋ฑ๋ก๋์ด ์๋ค ๋ณด๋, ์ค์ ์ฝ๋๊ฐ ์คํ๋ ๋ ์ ์ธ๋ฌธ๋ณด๋ค ์์์ ๋ณ์๋ ํจ์๋ฅผ ํธ์ถํด๋ ์๋ฌ ์์ด ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋ ๊ฒ์ ๋๋ค. ํด๋น ํ์์ ๋ง์น ์๋ก ๋์ด์ฌ๋ ค์ง ๊ฒ ๊ฐ๋ค๊ณ ํ์ฌ 'ํธ์ด์คํ '์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
๋ณ์ ํธ์ด์คํ : var / let, const
๋ณ์๊ฐ ํธ์ด์คํ ๋ ๋, ์ด๋ค ํค์๋๋ก ์ ์ธํ๋๋์ ๋ฐ๋ผ ์์ง ๋ด๋ถ์์ ์์ ํ ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค. ์ฌ๊ธฐ์ ํจ๊ป ๊ธฐ์ตํ๊ณ ๋ด์ผ ํ ๊ฐ๋ ์ ๋ณ์์ ์๋ช ์ฃผ๊ธฐ 3๋จ๊ณ(์ ์ธ, ์ด๊ธฐํ, ํ ๋น)์ ๋๋ค.
โ var ๋ณ์์ ํธ์ด์คํ : ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ๋์์
์์คํ์ธ
console.log(str); // ์๋ฌ๊ฐ ๋์ง ์๊ณ undefined๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
var str = "junesker"; // ์ค์ ๊ฐ์ด ํ ๋น๋๋ ์ ์ธ๋ฌธ
console.log(str); // ํ ๋น์ด ์๋ฃ๋์์ผ๋ฏ๋ก "junesker" ์ถ๋ ฅ
var ํค์๋๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ปดํ์ผ ๋จ๊ณ์์ '์ ์ธ'๊ณผ '์ด๊ธฐํ'๋ฅผ ๋์์ ์งํํฉ๋๋ค. ์ฆ, ๋ด์ญ์ ์ด๋ฆ์ ์ ์๋ง์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ๊ธฐ๋ณธ๊ฐ์ธ undefined๋ฅผ ์ฑ์ ๋ฃ์ต๋๋ค.
โก let, const ๋ณ์์ ํธ์ด์คํ : ์ ์ธ๋ง ๋จผ์ , ์ด๊ธฐํ๋ ๋ณด๋ฅ
์์ค ํ์ธ
console.log(data); // โ ReferencesError ๋ฐ์
let data = "value";
๋ง์ ๊ฐ๋ฐ์๊ฐ let๊ณผ const๋ ํธ์ด์คํ ์ด ์ผ์ด๋์ง ์๋๋ค๊ณ ์คํดํฉ๋๋ค. ํ์ง๋ง let๊ณผ const ์ญ์ ๋ถ๋ช ํ ํธ์ด์คํ ์ ๊ฐ๋ฅํฉ๋๋ค. ์ฐจ์ด์ ์ ์ปดํ์ผ ๋จ๊ณ์์ '์ ์ธ'๋ง ์ด๋ฃจ์ด์ง๊ณ , undefined๋ฅผ ์ฑ์ ๋ฃ๋ '์ด๊ธฐํ'๋ ์ ๋ ๋ฏธ๋ฆฌ ํ์ง ์๋๋ค๋ ์ ์ ๋๋ค. ์ด๊ธฐํ ๋จ๊ณ๋ ์ฝ๋๊ฐ ์คํ๋๋ค๊ฐ ์ค์ let์ด๋ const ๋ณ์๊ฐ ์ ํ ์ฝ๋ ์ค์ ๋๋ฌํ์ ๋์ผ ๋น๋ก์ ์ํํฉ๋๋ค.
์ ์์ค๋ฅผ ๋ณด๋ฉด, let๊ณผ const๋ก ์ ์ธ๋ ๋ณ์๋ ํธ์ด์คํ ์์ฒด๋ ์ผ์ด๋ฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํด๋น ๋ณ์์ ์กด์ฌ๋ ์๊ณ ์์ต๋๋ค. ํ์ง๋ง ์ด๊ธฐํ ๋จ๊ณ๊ฐ ์ค์ ์ฝ๋ ์ค์ ๋๋ฌํ๊ธฐ ์ ๊น์ง ๋ณด๋ฅ๋๋ฏ๋ก, ๊ทธ ์ฌ์ด์ ์ฌ๊ฐ์ง๋์ธ TDZ(Temporal Dead Zone) ์์ญ์์ ๋ณ์๋ฅผ ํธ์ถํ๋ฉด "์ด๊ธฐํ ์ ์ ์ ๊ทผํ ์ ์๋ค"๋ ๋ช ํํ ๋ ํผ๋ฐ์ค ์๋ฌ๋ฅผ ๋์ ธ ๊ฐ๋ฐ์์ ์ค์๋ฅผ ์์ฒ ์ฐจ๋จํ ์ ์์ต๋๋ค.
TDZ(Temporal Dead Zone, ์ผ์์ ์ฌ๊ฐ์ง๋)๋ ๋ฌด์์ธ๊ฐ?
let๊ณผ const๊ฐ ๊ฐ์ง ๋ ํนํ ์๋ช ์ฃผ๊ธฐ ๋๋ฌธ์ TDZ๋ผ๋ ๊ฐ๋ ์ด ํ์ํฉ๋๋ค. ์ค์ฝํ์ ์์ ์ง์ (์ฝ๋์ ์ต์๋จ)๋ถํฐ ๋ณ์์ ์ค์ ์ ์ธ๋ฌธ์ด ์๋ ์์น๊น์ง๋ ๋ณ์๊ฐ ๋ด์ญ์ ์ด๋ฆ๋ง ์์ ๋ฟ, ๋ฉ๋ชจ๋ฆฌ ๋ฐฉ(์ด๊ธฐํ)์ด ์๋ ์ํ์ ๋๋ค. ์ด ์ฌ๊ฐ์ง๋ ๊ตฌ๊ฐ์์ ๋ณ์์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฐธ์กฐ ์๋ฌ(ReferencesError)๋ฅผ ๋ฐ์์์ผ ์ ๊ทผ์ ์์ฒ ์ฐจ๋จํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๊ตฌ๊ฐ์ TDZ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์์ค ํ์ธ
// -- TDZ ๊ตฌ๊ฐ ์์
// ์์ง ๋ด๋ถ ๋ด์ญ์๋ 'student'๋ผ๋ ์ด๋ฆ์ด ๋ฑ๋ก์ ๋์ด ์์ (ํธ์ด์คํ
O)
// ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ(์ด๊ธฐํ)์ด ์์ง ์์
console.log(student); // โ ReferencesError: Cannot access student' before initialization
// ์ด๊ธฐํํ๊ธฐ ์ ์๋ ๋ณ์์ ์ ๊ทผํ ์ ์๋ค๋ ์๋ฌ๋ฅผ ๋์ง๋๋ค.
// -- TDZ ๊ตฌ๊ฐ ๋
// ํด๋น ์ค์ ๋๋ฌํด์์ผ ๋น๋ก์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ๋ณด(์ด๊ธฐํ + ํ ๋น)
let student = "ํ๊ธธ๋";
console.log(student); // "ํ๊ธธ๋"์ด ์ถ๋ ฅ๋ฉ๋๋ค.
์ค๋ฌด์์ ์ง์ผ์ผ ํ ๋ณ์ ์ ์ธ ๊ฐ์ด๋๋ผ์ธ
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์ var์ ์ฑ์ฉ๋ฅ ์ 0%์ ์๋ ดํด์ผ ํฉ๋๋ค. ์ค๋ฌด ๋ฐ ๋๊ท๋ชจ ์ํคํ ์ฒ ์ค๊ณ ์ ๊ถ์ฅ๋๋ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ๊ธฐ๋ณธ ์ค์ ์ ํญ์ const๋ก ์์
๋๋ถ๋ถ์ ๋ณ์๋ ํ ๋ฒ ์ ์ธ๋ ํ ์ฌํ ๋น๋ ์ผ์ด ์๊ฐ๋ณด๋ค ๋ง์ง ์์ต๋๋ค. ์ฝ๋๋ฅผ ์ฝ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์๊ฒ "์ด ๊ฐ์ ์์ ํ ์์์ ๋๋ค."๋ผ๋ ์ ๋ขฐ๋ฅผ ์ฃผ๊ธฐ ์ํด const๋ฅผ ๋ํดํธ๋ก ์ฌ์ฉํฉ๋๋ค.
2. ์ฌํ ๋น์ด ๋ช ํํ ํ์ํ ์๊ฐ์๋ง ์ ํ์ ์ผ๋ก let์ ์ฌ์ฉ
3. var๋ ์์ ํ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ถ์ํ ๋๋ง ์ดํดํ๊ณ , ์๋ก ์์ฑํ๋ ์ฝ๋์๋ ์ ๋ ๊ธ์ง
์ค๋ฌด์์ ์ด ๊ท์น์ '๊ฐ์ '๋ก ์งํค๊ฒ ๋ง๋๋ ๋๊ตฌ๋ค
๊ฐ๋ฐ์๋ค์ด "์งํค๋ฉด ์ข๊ณ ์ ์งํค๋ฉด ๋ง๊ณ " ์์ผ๋ก ํํํ์ง ๋ชปํ๋๋ก, ์ค๋ฌด์์๋ ์๋ ์ฝ๋ ๊ฒ์ฌ ๋๊ตฌ(
Linter)๋ฅผ ํตํด ์ด ๊ฐ์ด๋๋ผ์ธ์ ๊ฐ์ ํฉ๋๋ค.
โ ESLint์ 'no-var' ๊ท์น
๊ธฐ์ ์ฉ ํ๋ก์ ํธ๋ฅผ ์ธํ ํ ๋ ํ์์ ์ผ๋ก ์ฌ์ฉํ๋ ESLint์๋ 'no-var' ๋ผ๋ ๊ธฐ๋ณธ ๊ท์น์ด ์์ต๋๋ค. ์ฝ๋์ var ๋ผ๋ ๊ธ์๊ฐ ํ๋๋ผ๋ ๋ค์ด๊ฐ๋ฉด ์์ค ์ฝ๋๊ฐ ์ ์ฅ๋๊ฑฐ๋ Git์ ์ ๋ก๋(Commit)๋๋ ๊ฒ ์์ฒด๊ฐ ์ฐจ๋จ๋ฉ๋๋ค.
โก ESLint์ 'prefer-const' ๊ท์น
์ด ๊ท์น์ "์ฌํ ๋น๋์ง ์๋ ๋ณ์๋ ๋ฌด์กฐ๊ฑด const๋ก ์ ์ธํ๋ผ"๊ณ ๊ฐ์ ํ๋ ๊ท์น์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ฒ์์๋ ๊ฐ์ด ๋ณํ ์ค ์๊ณ let a = 10; ์ด๋ผ๊ณ ์ ์์ผ๋, ๋ฐ์๋ a๋ฅผ ์ฌํ ๋นํ๋ ์ฝ๋๊ฐ ์๋ค๋ฉด ์๋ฌ(๋๋ ๊ฒฝ๊ณ )๋ฅผ ๋์ฐ๋ฉฐ const๋ก ๋ฐ๊พธ๋ผ๊ณ ๊ฐ์ํฉ๋๋ค.
์ค๋ฌด ๊ฐ๋ฐ์๋ค์ด const๋ฅผ ๋ํดํธ๋ก ์ฐ๋ ์ง์ง ์ด์
๋จ์ํ "์๋ฌ๋ฅผ ์๋ด๋ ค๊ณ " ์ฐ๋๊ฒ ์๋๋๋ค. ๋๊ท๋ชจ ํ์ ๊ณผ ์ ์ง๋ณด์ ๊ด์ ์์ ์ด๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
โ ์ฝ๊ธฐ ์ข์ ์ฝ๋ (๊ฐ๋ ์ฑ๊ณผ ์ฌ๋ฆฌ์ ์์ ๊ฐ)
์์ฒ ์ค์ ์ฝ๋๋ฅผ ์ฝ์ด ๋ด๋ ค๊ฐ ๋, ์ด๋ค ๋ณ์๊ฐ const๋ก ์ ์ธ๋์ด ์๋ค๋ฉด ๊ฐ๋ฐ์๋ "์? ์ด ๋ณ์์ ๋ด๊ธด ๊ฐ์ด๋ ๊ฐ์ฒด์ ์ฃผ์๋ ์ด ํ์ผ ๋๋ ๋๊น์ง ์ ๋ ๋ณํ์ง ์๋๊ตฌ๋?"๋ผ๋ ํ์ ์ ํ๊ณ ์ฝ๋๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. ๋ฐ๋ฉด let์ ๋ณด๋ฉด "์ด๋๊ฐ์์ ์ด ๊ฐ์ด ๋ฐ๋๊ฒ ๊ตฌ๋?"ํ๊ณ ์คํฌ๋กค์ ๋ด๋ ค ๊ทธ ๋ณ์๊ฐ ์ฌํ ๋น๋๋ ์ง์ ์ ์ฐพ์์ผ ํฉ๋๋ค. ์ฆ, const๋ ๋๋ฃ ๊ฐ๋ฐ์์ ์๊ฐ์ ๋น์ฉ์ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค.
โก ๋ถ์ ํจ๊ณผ(Side Effect) ์ ์์ฒ ์ฐจ๋จ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ด ์ฃผ๋ฅ๊ฐ ๋ ํ ๊ฐ๋ฐ์์๋ '๋ถ๋ณ์ฑ(Immutability)'์ ์ ์งํ๋ ๊ฒ์ด ๋ฒ๊ทธ๋ฅผ ์ค์ด๋ ์ต๊ณ ์ ๋ฐฉ๋ฒ์ ๋๋ค. ์์ธกํ์ง ๋ชปํ ์๊ฐ์ ๋ณ์ ๊ฐ์ด ํํ ๋ฐ๋๋ฉด ๋๋ฒ๊น ์ด ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น์์ง๋๋ค. const๋ ๊ฐ๋ฐ์์ ์ค์๋ก ์ธํ ์ฌํ ๋น์ ๋ฌธ๋ฒ ๋ ๋ฒจ์์ ๋ง์์ฃผ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ์๋ฒฝํ๊ฒ ๋ณด์ฅํ ์ ์์ต๋๋ค.
@Junesker
'DEVELOPMENT > Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ์ด ์๊ธฐ ์๋ฆฌ์ฆ - 2: ๋ ์์ปฌ ์ค์ฝํ์ ์ค์ฝํ ์ฒด์ธ (0) | 2026.05.26 |
|---|