| ์ค๋ณต ์ ์ธ | ์ฌํ ๋น | Scope(์ ํจํ ์ฐธ์กฐ ๋ฒ์) | |
|---|---|---|---|
| var | O | O | ํจ์ ๋ ๋ฒจ |
| let | X | O | ๋ธ๋ก ๋ ๋ฒจ { } |
| const | X | X | ๋ธ๋ก ๋ ๋ฒจ { } |

console.log(greeting);
// undefined
var greeting = 'hello';
โ ์ ์ฝ๋๊ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์๋ ์ด์ ๋ ํธ์ด์คํ ๋๋ฌธ์ด๋ค. JavaScript ์ธํฐํ๋ฆฌํฐ๋ ๋ณ์ ์์ฑ์ ์ ์ธ(var greeting) ๋จ๊ณ ๋ฐ ํ ๋น(= โhelloโ) ๋จ๊ณ๋ฅผ ๋ถํ ํ๋ค. ์ ์ธ ๋ถ๋ถ์ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ํ์ฌ ๋ฒ์์ ๋งจ ์๋ก ํธ์ด์คํ ๋๊ณ ์ด๊ธฐ์ undefined ๊ฐ์ด ํ ๋น๋๋ค. ์ฆ, ์ด๊ธฐํ๋๊ธฐ ์ ์ greeting ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
let ๋๋ const๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์ค์ ๋ก ๋ณ์๋ ์ฌ์ ํ ํธ์ด์คํ
๋๋ค. ํ์ง๋ง ์ฐจ์ด์ ์ var๋ ์ค์ ํ ๋น ๊ฐ์ด ํ ๋น๋๊ธฐ์ ๊น์ง undefined ๊ฐ์ด ํ ๋น๋์ง๋ง let / const๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ์ ์ด๊ธฐ์ ์ด๋ค ๊ฐ๋ ํ ๋น๋์ง ์๋๋ค.

console.log(greeting);
// Uncaught ReferenceError: Cannot access 'greeting' before initialization
const greeting = "hello";
โ ์ด๋ฒ์๋ ํธ์ด์คํ ์ ๋์ง๋ง ๋ณ์๋ ์ด๊ธฐ์ undefined๋ก ์ด๊ธฐํ๋ var์ ๋ฌ๋ฆฌ ์ด๊ธฐ์ ์ด๊ธฐํ๋์ง ์๋๋ค. ์ฝ๋๊ฐ ์คํ๋๋ฉด ๊ฐ์ ํ ๋นํ๊ธฐ ์ ์ ์ฝ์ ๋ก๊ทธ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. const ๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
์ด๋ฌํ ์ผ์ด ๋ฐ์ํ๋ ์ด์ ๋ฅผ TDZ(Temporal Dead Zone)์ด๋ผ๊ณ ํ๋ค. ์ผ์์ ๋ฐ๋ ์กด์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ผ์์ ์ธ ๋นํ์ฑ ์ํ๋ฅผ ๋ํ๋ธ๋ค.
๐ก ๊ฒฐ๋ก !
๋ณ์๋ฅผ ์์ฑํ ๋ ์ฌํ ๋น์ด ํ์์๋ค๋ฉด const๋ฅผ ์ฌ์ฉํ๋ค. ์ฌํ ๋น์ด ํ์ํ๋ค๋ฉด let์ ์ฌ์ฉํ์ง๋ง ๋ณ์์ scope๋ฅผ ์ต๋ํ ์ข๊ฒ ๋ง๋ค์ด์ ์ฌ์ฉํ๋๊ฒ best๋ค.