let ๋ณ์ ํธ์ด์คํ
์ด ๋ถ๋ถ, ๊ฐ์์์ ์ค๋ช
ํ์ ๊ฑฐ ๊ฐ์์, ์ ๊ฐ ๋ต๋ณ ๋จ๊ฒจ๋ด
๋๋ค. ๋ง์นจ ์ ๊ฐ ๋ฑ ๊ทธ ๊ฐ์๋ฅผ ๋ด์์. ๊ฐ์์์ let/const ๋ ํธ์ด์คํ
์ด ์๋๋ค๋ผ๊ณ ๋งํ์
จ๋๋ฐ MDN๋ฌธ์์๋ ๋๋ค๋ผ๊ณ ์จ์์ด์ ํท๊ฐ๋ฆฌ์๋ ๊ฑฐ ๊ฐ์์. ๊ทธ๋์ ์ ๊ฐ MDN ๋ฌธ์๋ ์ฝ๊ณ ์ข ํ
์คํธ ํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ช
ํด๋ณด๊ฒ ์ต๋๋ค. :)~~~Variables declared with let and const are also hoisted but, unlike var, are not initialized with a default value.~~~ ์ฐ์ Hoisting ์ด๋, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ ์ฒด ์์ค๋ฅผ ๋ฏธ๋ฆฌ ํ์ด์ ๋ณ์ ๋๋ function์ ๋ฏธ๋ฆฌ ์ฐพ์๋ด์ด ๋ฏธ๋ฆฌ ๋ฑ๋กํ๋ ํ๋ ๊ฒ์ด๊ณ , ์ด๋ก ์ธํ ์ฅ์ ์ ์์ค ์์์ ์๊ด์์ด ํด๋น ๋ณ์๋ฅผ ํธ์ถํ๋ ๊ณณ์์ ์๋ฌ๊ฐ ๋์ง ์๊ฒ ํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ณ์ ์ ์ธ๋ง ํธ์ด์คํ
ํ์ง, ์ด๊ธฐํํ์ง ์๋ ์ ์ด ์ค์ํ๊ฑฐ ๊ฐ์ต๋๋ค. var ๊ฐ์ ๊ฒฝ์ฐ๋ ์ต์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ๋ณ์๋ค์ ์ ์ธํ๊ณ , ์คํ๋ ๋๊น์ง ์ด๊ธฐํ๋์ง ์๋๋ค๋ฉด undefined๋ก ์ต๊ธฐํํฉ๋๋ค. let/const ๋ณ์๋ ๋ค ๋น์ทํ๋ฐ, ์ด๊ธฐํํ๊ธฐ ์ ๊น์ง๋ ๋ณ์ Read๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ฆ ์๋ฐ์คํฌ๋ฆฝํธ์์ง์ด ๋ฏธ๋ฆฌ ํด๋น ๋ณ์์ ๋ํด ์๊ณ ์๊ธฐ๋ ํ์ง๋ง, ์ฝ์ ์๊ฐ ์๋ ๊ฑฐ์ฃ . ๋ฐ๋ผ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ ๋ณ์๋ฅผ ํธ์ถํ๊ฒ๋๋ฉด, ๋น์ฐํ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ๋๋ค. ์ฌ๊ธฐ์์ ์ฌ์ฉ๋๋ ์ฉ์ด๊ฐ ๋ฐ๋ก Temporal Dead Zone(TDZ) ์ธ๊ฑฐ๊ตฌ์. ๋ง ๊ทธ๋๋ก, ๋ณ์๊ฐ ์ผ์์ ์ผ๋ก ์๋ฌด๋ฐ ์ญํ ์ ํ ์ ์๊ฒ ๋๋ ๊ทธ๋ฐ ๊ตฌ๊ฐ์ด๋ผ๋ ๊ฑฐ์์. ์ด๋ก์ธํด์ TDZ ๊ตฌ๊ฐ์์๋ let/var๊ฐ ํธ์ด์คํ
์ด ๋์ง ์๋ ๊ฑฐ๋ผ๊ณ ๋ณผ์ ์์ต๋๋ค. ์ข ๋ ์ ํํ๊ฒ TDZ ๋ scope๊ฐ ์์๋๋ {}๋ธ๋ญ๋ถํฐ let/const๊ฐ ์ด๊ธฐํ๋๋ ๊ณณ๊น์ง๋ฅผ ๋งํ๊ณ , ํธ์ด์คํ
์ด ์๋๋ TDZ๋ ์์ค์์ ์์๊ฐ ์๋๋ผ, ์คํ์ ์์๋ก ์ ํด์ง๋ ๊ฒ๋๋ค. ์ด๊ฒ ์ดํดํ๊ธฐ ์ข ๋ณต์กํ๋ฐ, ์ด ์๋ฅผ ๋ณด๋ฉด ์ข ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. { // TDZ starts at beginning of scope const func = () => console.log(letVar); // OK // Within the TDZ letVar access throws `ReferenceError` let letVar = 3; // End of TDZ (for letVar) func(); // Called outside TDZ! } ์ ์์ ์์, ์ฒซ๋ฒ์งธ const์์ func() ๋ letVar ๋ณ์๋ฅผ ์ด์ฉํ๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ์๋ฌ๊ฐ ์๋๋๋ฐ ๊ทธ ์ด์ ๊ฐ TDZ ์ธ๋ถ์์ ์ด func์ ํธ์ถํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ง์ฝ์ let levVar=3; ์ด์ ์ console.log(letVar)๋ฅผ ํธ์ถํ๋ค๋ฉด, ์๋ฌ๊ฐ ๋ฐ์ํ์๊ฒ๋๋ค. TDZ ๊ตฌ๊ฐ์ด์์ผ๋๊น์. ์ด๋ ๊ฒ TDZ๊ตฌ๊ฐ์ ๋ฒ์ด๋์ ํธ์ถ์ํ๊ฒ ๋๋ฉด let/const๋ ํธ์ด์คํ
์ด ๋๋ ๊ฑฐ๋ผ๊ณ ๋ณผ์ ์์ต๋๋ค. ๊ฐ์์์๋ ์ด๊ฒ์ ์ข ๋ ๊ตฌ๋ถ์ง์ด์ global ๋ณ์์ ์ง์ญ๋ณ์(block)์ผ๋ ์ด๋ค ํ์์ด ๋ํ๋๋์ง๋ ์๋ ค์ฃผ์
จ๋๋์. Global๋ณ์์ผ๋๋ ์์ ๋ณ์์์ฒด๊ฐ ๋ฑ๋ก์์ฒด๊ฐ ์๋๋ ๊ฒ์ ๋ณผ์ ์๋๋ฐ, ์ง์ญ๋ณ์์ผ๋๋ {}๋ธ๋ญ์ด ์์๋ ๋ ํด๋น ๋ณ์๊ฐ Block ์์ undefined๋ก ๋ฑ๋ก๋๋ ๊ฒ์ ์์ ์์ต๋๋ค. ๊ทธ๋ ์ง๋ง ์ด๋ ๊ฒ undefined๋ก ๋ณด์ธ๋คํ๋๋ผ๋, ์ด๋ฅผ TDZ ์์์ ํธ์ถ์ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์๋๊ฒ ๋ฉ๋๋ค. ์ด์ธ์๋ TDZ๋ก ์ธํด์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ช๊ฐ์ง ๋ ๋์ค๋๋ฐ์. ๊ทธ๊ฒ์ ์ฌ๊ธฐ์ ๋ ๋ณด์๋ฉด ์ข์๊ฑฐ ๊ฐ์์ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#temporal_dead_zone_tdz ์์ ๊ฐ ์ ๋์์์ด์ ์ดํดํ๊ธฐ๊ฐ ๊ด์ฐฎ์์ต๋๋ค. ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋์
จ๊ธธ ๋ฐ๋์. :)