์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ์ด๋ ๊ฒ ์๋ํ ๊น? ์ค์ฝํ์ ํธ์ด์คํ ๊ฐ๋ ์ ๋ฆฌ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ์ด๋ ๊ฒ ์๋ํ ๊น? ์ค์ฝํ์ ํธ์ด์คํ ๊ฐ๋ ์ ๋ฆฌ ๊ด๋ จ
์๋ฐ์คํฌ๋ฆฝํธ(Javascript)๋ ๋จ์ํ ์น ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ์คํฌ๋ฆฝํธ ์ธ์ด๋ฅผ ๋์ด, ์น ๊ฐ๋ฐ์ ๋ฌผ๋ก ๋ฐฑ์๋, ๋ชจ๋ฐ์ผ ์ฑ, ๊ทธ๋ฆฌ๊ณ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ๊น์ง ๋ค์ํ ๋ถ์ผ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ธ์ด์ ๋๋ค. ์ฒ์์ HTML๊ณผ CSS์ ํจ๊ป ์น ํ์ด์ง์ ๋์ ์ธ ๋์์ ๋ด๋นํ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์ธ์ด๋ก ์ฌ์ฉ๋์์ง๋ง, ํ์ฌ๋ Node.js์ ๊ฐ์ ๋ฐํ์ ํ๊ฒฝ ๋๋ถ์ ์๋ฒ ์ฌ์ด๋์์๋ ๋ง์ด ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ๋ํ React, Vue์ ๊ฐ์ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ ์์ํฌ๋ถํฐ Express, Nest์ ๊ฐ์ ๋ฐฑ์๋ ํ๋ ์์ํฌ, ๊ทธ๋ฆฌ๊ณ Electron, React Native๋ฅผ ํ์ฉํ ํฌ๋ก์ค ํ๋ซํผ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ๊น์ง ๊ฐ๋ฅํด, ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋นผ๋์ ์ ์๋ ํต์ฌ์ ์ธ ์ธ์ด๊ฐ ๋์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ ๊ฒ ๋ค์ํ ๋ถ์ผ์์ ํ์ฝํ ์ ์๋ ์ด์ ๋ ๋ฌด์์ผ๊น์? ์ฌ๋ฌ ์ด์ ๊ฐ ์๊ฒ ์ง๋ง, ๊ทธ์ค ํ๋๋ ๋ฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ฐ์ง ๋ ํนํ ์คํ ๋ฐฉ์์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค๋ฅธ ์ธ์ด๋ค๊ณผ ๋น๊ตํ์ ๋ โ์ค์ฝํ(Scope)โ์ โํธ์ด์คํ (Hoisting)โ๊ณผ ๊ฐ์ ๋ ํนํ ๊ฐ๋ ์ ๋ฐํ์ผ๋ก ๋์ํ๋ฉฐ, ์ด ๋ ๊ฐ๋ ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ฐ๊ณ ์ฌ์ฉํ๊ธฐ ์ํด ํ์์ ์ผ๋ก ์์์ผ ํ๋ ๊ฐ๋ ์ค ํ๋๋ก, ์ด๋ฒ ๊ธ์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ค์ฝํ๋?
๋จผ์ ์ค์ฝํ์ ๋ํด ์์๋ณผ๊น์? ์ค์ฝํ๋ โ๋ฒ์โ๋ฅผ ์๋ฏธํ๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ฑ๋ ๋ณ์๋ ํจ์๊ฐ ์ด๋์์ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ , ์ ํจํ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ท์น์ ๋งํฉ๋๋ค. ์ฝ๊ฒ ๋งํด, ์ด๋ค ๋ณ์๋ ํจ์๊ฐ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๋ฒ์๋ฅผ ์ค์ฝํ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์๋ ์ฌ๋ฌ ์ข ๋ฅ์ ์ค์ฝํ๊ฐ ์กด์ฌํฉ๋๋ค.
1) ์ ์ญ, ์ง์ญ ์ค์ฝํ
๋จผ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค์ฝํ๋ ํฌ๊ฒ ์ ์ญ(Global)๊ณผ ์ง์ญ(Local)์ผ๋ก ๋๋ ์ ์์ต๋๋ค. ์ ์ญ ์ค์ฝํ๋ ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ณ์์ ๋ฒ์๋ฅผ ์๋ฏธํ๋ฉฐ, ์ง์ญ ์ค์ฝํ๋ ํน์ ํจ์๋ ๋ธ๋ก ๋ด๋ถ์์๋ง ์ ํจํ ๋ฒ์๋ฅผ ๋ปํฉ๋๋ค. ๊ฐ๋จํ ์์ ๋ฅผ ํตํด ์ด ๋ ์ค์ฝํ์ ์ฐจ์ด๋ฅผ ์ดํด๋ณผ๊ฒ์.
let globalNum = 100;
function example() {
let localNum = 50;
console.log(globalNum); //100
console.log(localNum); //50
}
example();
console.log(globalNum); //100
console.log(localNum); //localNum is not defined
์ ์ฝ๋๋ globalNum
๊ณผ localNum
๋ณ์๊ฐ ์๋ก ๋ค๋ฅธ ์ค์ฝํ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ํฉ์ ๋ณด์ฌ์ฃผ๋ ์ฝ๋์ธ๋ฐ์. ์ด์ ๋ ๋ณ์๊ฐ ์ด๋ค ์ ํจ ๋ฒ์๋ฅผ ๊ฐ์ง๋ฉฐ, ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ ์ด๋ป๊ฒ ๋์ค๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ์ฝ๋์ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ์ธ ์ ์ญ ๊ณต๊ฐ์ ์ ์ธ๋ globalNum
๋ณ์๋ฅผ ์ดํด๋ด
์๋ค. ์ ์ญ ๋ณ์๋ ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ์ ๊ทผํ ์ ์๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋๋ฐ์. ์ด๋ฌํ ์ ์ญ ๋ณ์๋ ์ ์ญ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋๋ค. ์ ์ญ ์ค์ฝํ๋ฅผ ๊ฐ์ง ๋ณ์๋ ์ด๋์์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค๋ ํน์ง์ด ์์ต๋๋ค.
์ฝ๋์์ example ํจ์ ๋ด๋ถ์ console.log(globalNum)
์ด ์คํ๋์์ ๋, globalNum
๋ณ์๋ ํจ์ ๋ด๋ถ์ ์ ์ธ๋์ง๋ ์์์ง๋ง, ์ ์ญ ์ค์ฝํ๋ฅผ ๊ฐ์ง ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ์ ์ญ ๊ณต๊ฐ์ ์ ์ธ๋ globalNum
๊ฐ์ธ 100์ ์ ๊ทผํด ์ถ๋ ฅํ ์ ์์ต๋๋ค. ๋ํ ํจ์ ํธ์ถ ์ดํ, ํจ์ ์ธ๋ถ์์ console.log(globalNum)
์ ์คํํ ๋๋ ์ ์ญ ๋ณ์์ธ globalNum
๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ฏ๋ก ๊ฐ์ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
๋ค์์ผ๋ก, example ํจ์ ๋ด๋ถ์ ์ ์ธ๋ localNum
๋ณ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. localNum
๋ณ์๋ ํจ์ ๋ด๋ถ์์๋ง ์ ํจํ ์ง์ญ ๋ณ์๋ก, ์ ์ญ ๋ณ์์ธ globalNum
๊ณผ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฒ์๋ฅผ ๊ฐ์ง๋๋ค. ์ง์ญ ๋ณ์๋ ์ง์ญ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ฉฐ, ํด๋น ํจ์๋ ๋ธ๋ก ๋ด๋ถ์์๋ง ์ ํจํฉ๋๋ค.
์ฝ๋์์ console.log(localNum)
๊ฐ example ๋ด๋ถ์์ ์คํ๋ ๋, localNum
๋ณ์๋ ํจ์ ๋ด๋ถ์ ์ ์ธ๋ ๋ณ์์ด๋ฏ๋ก, ํด๋น ๋ณ์์ ๊ฐ์ธ 50์ด ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์ฃ . ๊ทธ๋ ๋ค๋ฉด, ํจ์ ํธ์ถ์ด ๋๋ ์ดํ์ ํจ์ ์ธ๋ถ์์ console.log(localNum)
๋ฅผ ์คํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
localNum
๋ณ์๋ ์ง์ญ ์ค์ฝํ๋ฅผ ๊ฐ๋ ์ง์ญ ๋ณ์๋ก, example ํจ์ ๋ด๋ถ์์๋ง ์ ํจํ ์ ๊ทผ ๋ฒ์๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์, ํจ์ ๋ฐ๊นฅ์์๋ ์กด์ฌํ์ง ์๋ ๋ณ์๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์ด์ฒ๋ผ ์ง์ญ ๋ณ์๋ ์ ์ธ๋ ํจ์๋ ๋ธ๋ก ๋ด๋ถ์์๋ง ์ ํจํ ๋ฒ์๋ฅผ ๊ฐ๊ณ , ์ค์ฝํ๋ฅผ ๋ฒ์ด๋๋ฉด ๋ ์ด์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ ์ญ ๋ณ์์ ์ง์ญ ๋ณ์๊ฐ ์ด๋ค ๋ฒ์๋ฅผ ๊ฐ์ง๋์ง, ๊ทธ ์ฐจ์ด๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ์ญ ์ค์ฝํ์ ์ง์ญ ์ค์ฝํ์ ์ฐจ์ด๋ฅผ ์ดํดํ์ผ๋, ์ด์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ค์ํ ๋ ๋ค๋ฅธ ์ค์ฝํ์ธ ํจ์ ์ค์ฝํ(Function Scope)์ ๋ธ๋ก ์ค์ฝํ(Block Scope)๋ฅผ ์์๋ณผ๊ฒ์.
2) ํจ์, ๋ธ๋ก ์ค์ฝํ
ํจ์ ์ค์ฝํ์ ๋ธ๋ก ์ค์ฝํ๋ ๋ณ์ ์ ์ธ ๋ฐฉ์์ ๋ฐ๋ผ ๋์ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ํจ์ ์ค์ฝํ๋ ํจ์ ๋ด๋ถ์์ ์ ์ธ๋ ๋ณ์๋ ํจ์๊ฐ ํด๋น ํจ์ ๋ด์์๋ง ์ ํจํ ๋ฒ์๋ฅผ ๊ฐ์ง๋ ์ค์ฝํ๋ฅผ ๋งํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ var ํค์๋๋ ํจ์ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ํจ์ ๋ด๋ถ์ ์ ์ธ๋ ๋ณ์๋ ํจ์ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์๋์ ์์๋ฅผ ํตํด ์ดํด๋ณผ๊ฒ์.
function example() {
var funcVar = "๋๋ ํจ์ ์ค์ฝํ ๋ณ์!";
console.log(funcVar); // "๋๋ ํจ์ ์ค์ฝํ ๋ณ์!"
}
example();
console.log(funcVar); // ์ค๋ฅ: funcVar is not defined
funcVar
๋ณ์๋ ํจ์ ๋ด๋ถ์์ ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์, ํจ์ ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ example ํจ์์ ๋ด๋ถ์์ funcVar
ํจ์์ ์ ๊ทผํ๋ ค ํ๋ค๋ฉด, ์์ ์ฝ๋์ ๊ฐ์ด funcVar
๋ณ์๊ฐ ์ ์๋์ด ์์ง ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ํจ์ ์ค์ฝํ๋ ํจ์๊ฐ ์คํ๋ ๋ ๋ณ์๊ฐ ์์ฑ๋๊ณ , ํจ์๊ฐ ์ข
๋ฃ๋๋ฉด ๋ณ์๊ฐ ์๋ฉธ๋๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
ํจ์ ์ค์ฝํ์๋ ๋ค๋ฅด๊ฒ, ๋ธ๋ก ์ค์ฝํ๋ {}
์ค๊ดํธ๋ก ๊ฐ์ธ์ง ๋ธ๋ก ๋ด๋ถ์์๋ง ์ ํจํ ๋ฒ์๋ฅผ ๊ฐ์ง๋๋ค. let
๊ณผ const
ํค์๋๋ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ํด๋น ๋ธ๋ก์ ๋ฒ์ด๋๋ฉด ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ฝ๋๋ฅผ ํตํด ์์ธํ๊ฒ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
if (true) {
let blockVar = "๋๋ ๋ธ๋ก ์ค์ฝํ ๋ณ์!";
console.log(blockVar); // "๋๋ ๋ธ๋ก ์ค์ฝํ ๋ณ์!"
}
console.log(blockVar); // ์ค๋ฅ: blockVar is not defined
blockVar
๋ณ์๋ let
ํค์๋๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๊ฐ๊ณ , ๋ธ๋ก ์ค์ฝํ๋ ์ค๊ดํธ๋ก ๊ฐ์ธ์ง ๋ธ๋ก ๋ด๋ถ์์๋ง ์ ํจํ๋ฏ๋ก, ์์ ์ฝ๋์์๋ if
๋ฌธ์ ๋ด๋ถ์์๋ง ์ ํจํ ๋ณ์์
๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ธ๋ก์ ๋ฒ์ด๋ ์์น์์ blockVar
๋ณ์์ ์ ๊ทผํ๊ฒ ๋ ๊ฒฝ์ฐ์๋ ์์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด์ฒ๋ผ ๋ธ๋ก ์ค์ฝํ๋ ๋ณ์์ ์ ํจ ๋ฒ์๋ฅผ ์ข ๋ ๋ช
ํํ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ค๋๋ค. ํนํ ๋ธ๋ก ์ค์ฝํ๋ฅผ ํ์ฉํ๋ฉด ํจ์ ์ค์ฝํ(var
)์ ์๋์น ์์ ๋์์ ๋ฐฉ์งํ ์ ์์ด, ์ฝ๋์ ์์ ์ฑ๊ณผ ๊ฐ๋
์ฑ์ ๋์ผ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ป๊ฒ ๋ณ์์ ์ ํจ ๋ฒ์๋ฅผ ๊ฒฐ์ ํ ๊น์? ์ด์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค์ฝํ ๊ฒฐ์ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ค์ฝํ ๊ฒฐ์ ๋ฐฉ๋ฒ
์๋ฐ์คํฌ๋ฆฝํธ์๋ ๋ณ์์ ํจ์๊ฐ ์ด๋์์ ์ ํจํ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค. ๋ฐ๋ก ๋์ ์ค์ฝํ(Dynamic Scope)์ ์ ์ ์ค์ฝํ(Static Scope)์ ๋๋ค. ์ด ๊ฐ๋ ๋ค์ ์ฝ๋๊ฐ ์์ฑ๋ ์์น์ ์คํ๋๋ ์์ ์ ๋ฐ๋ผ, ํน์ ๋ณ์์ ์ ๊ทผํ ์ ์๋์ง๋ฅผ ์ ์ํ๋ ์ค์ํ ๊ฐ๋ ์ธ๋ฐ์. ์ด๋ฅผ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฝ๋์ ๋์ ๋ฐฉ์์ ๊ฒฐ์ ํ๊ณ , ๋ณ์ ๊ฐ์ ํผ๋์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ด์ ๋์ ์ค์ฝํ์ ์ ์ ์ค์ฝํ๊ฐ ๊ฐ๊ฐ ์ด๋ค ํน์ง์ ๊ฐ์ง๋์ง, ๊ทธ๋ฆฌ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด ์ค ์ด๋ค ๋ฐฉ์์ ๋ฐ๋ฅด๋์ง ๋ณผ๊น์?
1) ๋์ , ์ ์ ์ค์ฝํ
๋์ ์ค์ฝํ๋ ํจ์๋ ๋ณ์๊ฐ ํธ์ถ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณ์์ ์ ํจ ๋ฒ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์์ ๋๋ค. ์คํ ์์ ์ ํ์ฑํ๋ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ณ์์ ๊ฐ์ ์ฐพ๊ธฐ ๋๋ฌธ์, ์ฝ๋์ ์์ฑ ์์ ๊ณผ ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์์ ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
let globalVar = "๋๋ ์ ์ญ ๋ณ์";
function outer() {
let outerVar = "๋๋ ์ธ๋ถ ๋ณ์";
inner();
}
function inner() {
console.log(globalVar); // "๋๋ ์ ์ญ ๋ณ์"
console.log(outerVar); // ์ค๋ฅ ๋ฐ์
}
outer();
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋์ ์ค์ฝํ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ, inner ํจ์๊ฐ outer ํจ์์์ ํธ์ถ๋์๊ธฐ ๋๋ฌธ์ outerVar
๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ์ฝ๋๋ฅผ ์คํํ๋ฉด inner ํจ์๋ outerVar
๋ณ์์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ ์ด์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋์ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ด์ฃ .
๋์ ์ค์ฝํ๋ ๋ณ์์ ์ ํจ ๋ฒ์๊ฐ, ์คํ๋๋ ์์ ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค๋ ํน์ง์ด ์์ต๋๋ค. ์คํ ์ค์ธ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ณ์์ ์ ํจ ๋ฒ์๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์, ํธ์ถ๋๋ ์์น์ ๋ฐ๋ผ ๋ณ์์ ๊ฐ์ ์ฐพ๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ์ฝ๋์ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง๊ณ , ๋์ ์ค์ฝํ๋ ์ด๋ฐ ๋ถํ์ค์ฑ ๋๋ฌธ์ ์ ์ง๋ณด์์ ๋๋ฒ๊น ์ด ์ด๋ ต์ต๋๋ค. ๊ทธ๋์ ํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๋ ๋ฐฉ์์ ๋๋ค.
๋์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ ๋๋ถ๋ถ์ ์ธ์ด๋ ์์ธก ๊ฐ๋ฅ์ฑ๊ณผ ์์ ์ฑ์ ์ํด ์ ์ ์ค์ฝํ๋ฅผ ์ฑํํ๊ณ ์๋๋ฐ์. ์ ์ ์ค์ฝํ๋ ์ฝ๋๊ฐ ์์ฑ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก, ์ฆ ๋ณ์๊ฐ ์ ์ธ๋ ์์ ์ ๊ธฐ์ค์ผ๋ก ๋ณ์์ ์ ํจ ๋ฒ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์์ ๋๋ค. ์คํ ์์ ๊ณผ๋ ๊ด๊ณ์์ด, ๋ณ์์ ํจ์๊ฐ ์ ์ธ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฝ๋๊ฐ ๋์ํ๋ฉฐ, ์ ์ ์ค์ฝํ๋ ์คํ ํ๊ฒฝ์ ์๊ด์์ด ์ฝ๋์ ๋์์ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค๋ ํน์ง์ด ์์ต๋๋ค.
2) ๋ ์์ปฌ ์ค์ฝํ
์ ์ ์ค์ฝํ๋ โ๋ ์์ปฌ ์ค์ฝํโ๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฐ๋ก ์ด ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๋ ์ธ์ด์ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํจ์์ ํธ์ถ ์์น๊ฐ ์๋, ์ ์ธ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ฝํ๊ฐ ๊ณ ์ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ณ์์ ํจ์์ ์ ๊ทผ ๊ฐ๋ฅ ๋ฒ์๊ฐ ๋ช ํํ๊ฒ ์ ์๋๋ฉฐ, ์ฝ๋๋ ๋ ์ง๊ด์ ์ด๊ณ ์์ธก์ด ๊ฐ๋ฅํด์ง๋๋ค.
let globalVar = "๋๋ ์ ์ญ ๋ณ์";
function outer() {
let outerVar = "๋๋ ์ธ๋ถ ๋ณ์";
function inner() {
console.log(globalVar); // "๋๋ ์ ์ญ ๋ณ์"
console.log(outerVar); // "๋๋ ์ธ๋ถ ๋ณ์"
}
inner();
}
outer();
์์ ์ฝ๋์์ inner ํจ์๋ outer ํจ์ ๋ด๋ถ์ ์ ์ธ๋์ด ์์ผ๋ฏ๋ก, inner ํจ์๋ ์ ์ธ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก outerVar
๋ณ์์ globalVar
๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ํธ์ถ ์์น์๋ ์๊ด์์ด, ์์ฑ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณ์๊ฐ ๊ฒฐ์ ๋๋ ๊ฒ์ด ๋ ์์ปฌ ์ค์ฝํ์ ํต์ฌ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
ํธ์ด์คํ ์ด๋?
์ด์ฒ๋ผ ๋ ์์ปฌ ์ค์ฝํ์ ํจ๊ป ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ๋ฐฉ์์ ์ดํดํ๋ ค๋ฉด, โํธ์ด์คํ (Hoisting)โ์ด๋ผ๋ ๊ฐ๋ ๋ ํ์์ ์ผ๋ก ์๊ณ ์์ด์ผ ํ๋๋ฐ์. ํธ์ด์คํ ์ ๋ณ์์ ํจ์์ ์ ์ธ๋ฌธ์ ์ฝ๋์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ๋ฐฉ์์ ๋ปํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํธ์ด์คํ ์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ์คํ ์์์ ์์ฑ ์์๋ฅผ ๋ค๋ฅด๊ฒ ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค.
1) ํจ์ ํธ์ด์คํ
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํธ์ด์คํ ์ ์ฌ์ฉํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ํจ์๊ฐ ์ ์ธ๋๊ธฐ ์ ์ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
sayHello();
function sayHello() {
console.log("hello world!");
}
์ฝ๋๋ฅผ ๋ณด๋ฉด, sayHello ํจ์๊ฐ ์ ์ธ๋๊ธฐ ์ด์ ์ ํธ์ถ๋์์ง๋ง ์คํ ๊ฒฐ๊ณผ, ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์์ง์ด ์คํ ์์ ์ ํจ์ ์ ์ธ์ ์ฝ๋์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง, ํจ์ ํํ์์ ํธ์ด์คํ ๋์ง ์์ ์๋์ ๊ฐ์ ์ฝ๋๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ฏ๋ก ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
sayHello(); // TypeError: sayHello is not a function
const sayHello = function () {
console.log("hello world!");
};
2) ๋ณ์ ํธ์ด์คํ
๋ณ์ ์ ์ธ ๋ํ ํธ์ด์คํ
์ ์ํฅ์ ๋ฐ์ต๋๋ค. var
ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ์ ์ธ๋ฌธ๋ง ๋์ด์ฌ๋ ค์ง๊ณ , ์ด๊ธฐํ๋ ํธ์ด์คํ
๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธ ์ ์ ๋ณ์์ ์ ๊ทผํ๋ฉด undefined
๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
console.log(num); // undefined
var num = 10;
์์ ์ฝ๋๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํด์ํ๋ ์์๋ก ๋ํ๋ด๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.
var num; // ์ ์ธ๋ฌธ์ด ๋์ด์ฌ๋ ค์ง
console.log(num); //undefined
num = 10; //์ด๊ธฐํ๋ ๋์ค์ ์ด๋ค์ง
์ ์ฝ๋์ ๊ฐ์ด, var num;
์ด๋ผ๋ ์ ์ธ๋ฌธ์ ์ฝ๋์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ก์ง๋ง, num = 10; ์ด๊ธฐํ ๋ฌธ์ ๋์ด์ฌ๋ ค์ง์ง ์์๊ธฐ ๋๋ฌธ์ undefined๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ์ด๋ฌํ ๋์์ ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก, ๋ณ์๋ฅผ ์ ์ธํ๊ธฐ ์ ์ ์ฌ์ฉํ๋ ์ต๊ด์ ์ง์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
3) let
๊ณผ var
var ํค์๋๋ฟ๋ง ์๋๋ผ, ๋ ๋ค๋ฅธ ๋ณ์ ์ ์ธ ํค์๋์ธ let
๊ณผ const
ํค์๋๋ ํธ์ด์คํ
์ด ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง var
ํค์๋์๋ ๋ค๋ฅด๊ฒ ์ด๊ธฐํ ์ด์ ์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋๋ฐ์. ๊ทธ ์ด์ ๋ ๋ฐ๋ก TDZ๋ผ๋ ๊ณต๊ฐ ๋๋ฌธ์
๋๋ค.
TDZ๋ Temporal Dead Zone, ์ฆ โ์ผ์์ ์ธ ์ฃฝ์์ ๊ณต๊ฐโ์ ๋ปํ๋ฉฐ, ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. let
๊ณผ const
๋ก ์ ์ธ๋ ๋ณ์๋ ์ค์ฝํ์ ์์ ์ง์ ๋ถํฐ ์ด๊ธฐํ๊ฐ ์๋ฃ๋ ๋๊น์ง TDZ์ ๋จธ๋ฌผ๊ฒ ๋ฉ๋๋ค. ์ด ๋๋ฌธ์ ์ด๊ธฐํ ์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํ์ง๋ง ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๊ณ ํด์ ํธ์ด์คํ ์ด ์ผ์ด๋์ง ์๋ ๊ฒ์ ์๋๋๋ค. ์ ์ธ ์์ฒด๋ ์ฌ์ ํ ํธ์ด์คํ ๋๊ณ , ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๊ธฐ ์ ๊น์ง๋ TDZ์ ์ํด ๋ณดํธ๋๋ฉฐ ์ฐธ์กฐ๊ฐ ์ฐจ๋จ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ํน์ง์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ฝ๋์ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ์ฅ์น๋ผ๊ณ ํ ์ ์์ต๋๋ค.
console.log(num); // ReferenceError: Cannot access โnumโ before initialization
let num = 10;
์ค์ ๋ก ์์ ์ฝ๋์ฒ๋ผ num
๋ณ์์ ์ ์ธ๋ฌธ ์์์ num
๋ณ์์ ์ ๊ทผํ๋ฉด ์์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ํ์์ TDZ ๋๋ฌธ์ด๋ฉฐ, TDZ๋ ๋ณ์๊ฐ ์ ์ธ๋๊ธฐ ์ ์๋ ์ ๊ทผํ ์ ์๋๋ก ๋ง์์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
๋ง์น๋ฉฐ
์ง๊ธ๊น์ง ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค์ฝํ์ ํธ์ด์คํ ์ ๋ํด ์์๋ณด์์ต๋๋ค. ์ค์ฝํ๋ ๋ณ์์ ํจ์์ ์ ํจ ๋ฒ์๋ฅผ ๊ฒฐ์ ํ๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ์ฌ์ฉํด ์ฝ๋ ์์ฑ ์์ ์ ๋ณ์์ ์ ์ธ ์์น์ ๋ฐ๋ผ ๋ณ์๊ฐ ์ ํจํ ๋ฒ์๋ฅผ ๊ณ ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฝ๋๋ฅผ ๋ ์ง๊ด์ ์ด๊ณ , ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๋ํ ํธ์ด์คํ
์ ๋ณ์์ ํจ์ ์ ์ธ์ ์ฝ๋์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ฆฌ๋ ๋ฏํ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋
ํนํ ๋์ ๋ฐฉ์์ผ๋ก, ์ ์ฐํ ์คํ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ ์ฐ์ฑ์ด ๋๋ก๋ ์๋ํ์ง ์์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋๋ฐ์. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด let
๊ณผ const
๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ก ์ค์ฝํ์ TDZ๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํฉ๋๋ค. ์ค์ฝํ์ ํธ์ด์คํ
์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ ๊น์ด ์ดํดํ๊ธฐ ์ํ ์ฒซ๊ฑธ์์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ๋
๋ค์ ์ดํดํ๋ฉด, ์ฝ๋ ์ต์ ํ๋ ์ ์ง๋ณด์ ์ธก๋ฉด์์๋ ๋์ฑ ๋ช
ํํ๊ณ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ฃ . ์ด์ ์ด ๊ฐ๋
๋ค์ ํ์ฉํด ๋ ํจ์จ์ ์ด๊ณ ์์ ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์๊ธธ ๋ฐ๋๋๋ค.