javascript์์ ECMA2015(ES6) ๋ฌธ๋ฒ์ด ํ์คํ ๋๋ฉด์, ๋ณ์๋ฅผ ์ ์ธํ ๋ ES6 ์ด์ ์ ์ฐ๋ var์ ์ง์ํ๊ณ ES6์ ์๋ก์ด ๋ฌธ๋ฒ์ธ let๊ณผ const๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์งํฅํ๊ฒ ๋์๋ค.
์ค์ ๋ก var์ ๊ฐ์ ํ๊ธฐ ์ํด ๋์จ ๋ฌธ๋ฒ์ด let, const์ด๊ธฐ ๋๋ฌธ์ด๊ธฐ๋ ํ๋ค. ๊ทธ๋ ๋ค๋ฉด, var์ ํน์ง์ ๋ฌด์์ด๊ณ ์ let, const๋ฅผ ์ฌ์ฉํด์ผํ๋ ๊ฒ์ธ์ง ๊ณต๋ถํด๋ดค๋ค.
var, let, const์ ํน์ง์ ์ดํด๋ณด๊ธฐ ์ ์, ๋ณ์๊ฐ ์์ฑ๋๋ ๊ณผ์ ๊ณผ TDZ์ ๋ํด์ ์ ๋ฆฌํด ๋ณผ ๊ฒ์ด๋ค.
javascript์์ ๋ณ์๋ 3๋จ๊ณ์ ๊ฑธ์ณ์ ์์ฑ๋๋ค.
var ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋, ์ ์ธ + ์ด๊ธฐํ๊ฐ ํ๋ฒ์ ์ด๋ฃจ์ด์ง๋ค.
๋ฐ๋ผ์, ๋ณ์ ์ ์ธ๋ฌธ ์ด์ ์ ๋ณ์์ ์ ๊ทผํด๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ undefined๋ฅผ ๋ฐํํ๋ค. ์ดํ ๋ณ์ ํ ๋น๋ฌธ์์ ๊ฐ์ด ํ ๋น๋๋ค.
const, let ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ๋ถ๋ฆฌ๋์ด ์งํ๋๋ค. ์ฆ, ์ค์ฝํ์ ๋ณ์๋ฅผ ์ ์ธ ํ์ง๋ง, ์ด๊ธฐํ ๋จ๊ณ๋ ๋ณ์ ์ ์ธ๋ฌธ์ ๋๋ฌํ์ ๋ ์ด๋ค์ง๋ค. ์ด๊ธฐํ ์ด์ ์ ๋ณ์์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ๋ณ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์์ง ํ๋ณด๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ ์๋ฌ(ReferenceError)๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์, ์ค์ฝํ ์์ ๋ถํฐ ์ด๊ธฐํ ์์ ์์ ๊น์ง ๊ตฌ๊ฐ์ TDZ๋ผ๊ณ ๋ถ๋ฅด๊ณ , let๊ณผ const๋ ์ด TDZ์ ์ํฅ์ ๋ฐ๋๋ค.
TDZ(Temporal Dead Zone), ์ฆ ์ผ์์ ์ฌ๊ฐ์ง๋๋ ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ ์ฌ์ด์์ ๋ณ์์ ์ ๊ทผ(์ฐธ์กฐ)ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
var์ ์ด๋ฌํ TDZ ์์ญ์ ๋ค์ด์๋ ์๋ฌ๊ฐ ์ถ๋ ฅ๋์ง ์๋๋ค. ์ฆ, TDZ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค. ์ค์ง์ ์ผ๋ก ์์์ ์ค๋ช
ํ ๊ฒ ์ฒ๋ผ var์ ์ ์ธ + ์ด๊ธฐํ๊ฐ ๋์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์, ์ ์ธ ์ ์ ๋ณ์์ ์ ๊ทผํ๋ค๊ณ ํ์ฌ TDZ์ ๋ค์ด๊ฐ ์ผ์ด ์๋ค.
ํ์ง๋ง, let๊ณผ const๋ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ์ค์ ๋ณ์ ์ ์ธ๋ฌธ์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ ์ธ๋ฌธ ์ ์ ๋ณ์์ ์ ๊ทผํ๊ฒ ๋๋ฉด TDZ ์์ญ์ ๋ค์ด์ค๊ฒ ๋๋ค. ๋ฐ๋ผ์, ์ด๊ธฐํ ์ด์ ์ ๋ณ์์ ์ ๊ทผํ๋ฉด ๋ณ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ ๋น๋์ง ์์ ์ํ์ด๊ธฐ ๋๋ฌธ์ ReferenceError(์ฐธ์กฐ ์๋ฌ)๋ฅผ ์ถ๋ ฅํ๋ค.
ํจ์๋ฅผ ์ ์ธํ ๋, var ํค์๋๋ฅผ ์๋ตํด๋ ์ธ์ ํด์ค๋ค.
๋ฐ๋ผ์, ์๋ฌต์ ์ ์ญ ๋ณ์๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ ๋ฌด์์ผ๊น?
function sayHi() {
if (true) {
var phrase = "Hello";
}
alert(phrase); // ์ ๋๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
}
sayHi();
alert(phrase); // Error: phrase is not defined
์ ์์ ๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ด๋ค. var์ ํจ์ ๋ ๋ฒจ ์ค์ฝํ์ด๊ธฐ ๋๋ฌธ์, ํจ์ ์์ ๋ค์ด์๋ phrase ๋ณ์๋ ํจ์ ๋ด์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ ์ง์ญ ๋ณ์๊ฐ ๋์๋ค. ๋ฐ๋ผ์, ํจ์ ๋ด์์ alert(phrase)๋ฅผ ํธ์ถ ํ์ ๋๋ ์ ์ถ๋ ฅ์ด ๋์ง๋ง, ํจ์ ์ธ๋ถ์์ alert(phrase)๋ฅผ ํธ์ถํ์ ๋๋ undefined ์๋ฌ๊ฐ ๋ฌ๋ค.
if (true) {
var test = true; // 'let' ๋์ 'var'๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
}
alert(test); // true (if ๋ฌธ์ด ๋๋ฌ์ด๋ ๋ณ์์ ์ฌ์ ํ ์ ๊ทผํ ์ ์์)
์ฌ๊ธฐ์ if๋ ํจ์๊ฐ ์๋, '์ฝ๋ ๋ธ๋ก'์ด๋ค. var์ ๋ธ๋ก ์ค์ฝํ๊ฐ ์๋, 'ํจ์ ์ค์ฝํ'์ด๊ธฐ ๋๋ฌธ์, var์ ํจ์๊ฐ ์๋ ์ฝ๋ ๋ธ๋ก์ ๋ฌด์ํ๋ค. ๋ฐ๋ผ์, ์ ์ญ์์ test ๋ณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ๋๋ค.
๋ฐ๋ผ์, ํจ์๊ฐ ์๋ ๊ณณ์์ ์ ์ธํ var์ ๋ชจ๋ ์ ์ญ ๋ณ์๊ฐ ๋๋ ๊ฒ์ด๋ค. ์ด๋ ์ ์ญ ๋ณ์๋ฅผ ๋จ๋ฐํ ๊ฐ๋ฅ์ฑ์ ๋ํ์, ๋์ค ํฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
var name = '์ด๋ฆ1';
var name = '์ด๋ฆ2';
var name = '์ด๋ฆ3';
console.log(name); //์ด๋ฆ3
์์ ๊ฐ์ด, ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ฌ์ ์ธ ๋ฐ ์ฌํ ๋น ํ์ผ๋, ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ ๊ฐ์ฅ ๋ง์ง๋ง์ ์ ์ธ ๋ฐ ํ ๋น๋ '์ด๋ฆ3'์ด ์ถ๋ ฅ๋๋ค.
์ค๋ณต ์ ์ธํด๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ์, ์๋์น ์๋ ๋ณ์๊ฐ์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์ํํ๋ค.
//var name; ํธ์ด์คํ
๋๋ค.
console.log(name); //undefined
var name = '์ด๋ฆ';
์ ์ธ์ ํธ์ด์คํ
(๋์ฌ)๋์ง๋ง, ํ ๋น์ ํธ์ด์คํ
๋์ง ์๋๋ค. ๋ฐ๋ผ์ console.log(name)์ ํธ์ถํ๋ฉด ํ ๋นํ ๊ฐ์ ํธ์ด์คํ
๋์ง ์์๊ธฐ ๋๋ฌธ์ undefined๊ฐ ์ถ๋ ฅ์ฐฝ์ ๋ฌ๋ค. undefined๋ ๋ณ์ ์ ์ธ์ ๋์์ผ๋, ์ด๋ ํ ๊ฐ๋ ํ ๋น๋์ง ์์ ์ํ๋ฅผ ๋ปํ๋ค.
์๋ฌดํผ, undefined๊ฐ ๋ฐ ๋ฟ ์๋ฌ๊ฐ ๋จ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์, var์ ์ ์ธ๋๊ธฐ๋ ์ ๋ถํฐ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ var์ TDZ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค๋ ์๋ฏธ๊ฐ ๋๋ค.
๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋, ๋ชจ๋ ์ฝ๋ ๋ธ๋ก(ํจ์, if, for, while, try/catch ...) ๋ด์์ ์ ์ธ๋ ๋ณ์๋ ์ฝ๋ ๋ธ๋ก ๋ด์์๋ง ์ ํจํ๋ฉฐ ์ฝ๋ ๋ธ๋ก ์ธ๋ถ์์๋ ์ฐธ์กฐํ ์ ์์์ ๋ปํ๋ค. ์ฆ, ์ฝ๋ ๋ธ๋ก ๋ด๋ถ์์ ์ ์ธํ ๋ณ์๋ ์ง์ญ ๋ณ์์ด๋ค.
์ด๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ์ฌ์ ์ ์ญ ๋ณ์๋ฅผ ๋จ๋ฐ ํ ๊ฐ๋ฅ์ฑ์ด ๋์๋ var์ ํ๊ณ๋ฅผ ๊ฐ์ ํ ๋ถ๋ถ์ด๋ค.
var์ ์ฌ์ ์ธ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ์๋์น ์์ ๋ณ์์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ์๋ ์๋ ์ํ์ด ์์๋ค. ์ด๋ฅผ ๊ฐ์ ํ let, const๋ ์ฌ์ ์ธ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋ง์ฝ ์ ์ธ๋ฌธ ์ด์ ์ ์ฐธ์กฐํ๋ฉด ์ฐธ์กฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. (ReferenceError)
์ด๋ const, let์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ์ค์ฝํ์ ์์์์ ๋ณ์์ ์ ์ธ๊น์ง TDZ์ ๋น ์ง๊ธฐ ๋๋ฌธ์ด๋ค. (TDZ๋ ์ ์ค๋ช
์ฐธ๊ณ )
console.log(foo); // undefined
var foo;
console.log(bar); // Error: Uncaught ReferenceError: bar is not defined
let bar;
ํ์ง๋ง, ์ฃผ์ํ ๊ฒ์ const, let์ด ์ ์ธ ์ ์ ๋ณ์์ ์ ๊ทผํ ์ ์๋ค๊ณ ํด์ ํธ์ด์คํ
์ด ์๋๋ ๊ฒ์ ์๋๋ค.
ํธ์ด์คํ
์ด๋, ์ค์ฝํ์์์๋ ์ ์ธ๋ค์ ๋ชจ๋ ์ค์ฝํ์ ์ต์์๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ ์๋ฏธํ๋ค. var ๋ฟ๋ง ์๋๋ผ, let, const ์ญ์ ํธ์ด์คํ
์ด ๋๋ค.
๊ทธ๋ฐ๋ฐ let, const๋ ์ ์ธ ์ ์ ํธ์ถํ๋ฉด ReferenceError๊ฐ ๋ด๋๋ฐ...?
๋ง์ฝ, let, const๊ฐ ํธ์ด์คํ ์ด ์๋๋ค๊ณ ๊ฐ์ ํด๋ณด์.
name = 'hello' // ReferenceError: Cannot access 'name' before initialization
let name = 'hi'
๋ง์ฝ, ํธ์ด์คํ ์ด ๋์ง ์๋๋ค๋ฉด, ๋๋ฒ์งธ let ์ ์ธ์์ already declared ์๋ฌ๊ฐ ๋ฌ์ด์ผ ํ๋ค. ํ์ง๋ง, ์๋ฌ ๋ด์ฉ์ ReferenceError, ์ฆ ์ด๊ธฐํ ํ๊ธฐ ์ ์ ์ก์ธ์ค ํ ์ ์๋ค๋ ๋ด์ฉ์ด๋ค.
๋ณ์๋ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ด ์ข๊ธฐ ๋๋ฌธ์, var์ ์ง์ํด์ผํ๋ค.
ES6์์๋ var์ ์ฌ์ฉํ์ง ๋ง์.
์ฌํ ๋น์ด ํ์ํ ๊ฒฝ์ฐ์ ํํด let์ ์ฌ์ฉํ๋ค. ์ด๋ ๋ธ๋ก์ ์ต๋ํ ์ข๊ฒ ๋ง๋ค์.
๋ณ๊ฒฝ์ด ๋ฐ์ํ์ง ์๋ ๊ฐ์๋ const๋ฅผ ์ฌ์ฉํ์. const๋ ์ฌํ ๋น์ ๊ธ์งํ๋ฏ๋ก var, let๋ณด๋ค ์์ ํ๋ค! (์๋์น ์์ ์ฌํ ๋น์ ๋ฐฉ์งํด ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ์์ ํ๋ค)
์ผ๋จ const ์ฌ์ฉํ๊ณ , ๋์ค ์ฌํ ๋น ํ์ํ๋ฉด let์ผ๋ก ๋ณ๊ฒฝํ์.
๐ ์ฐธ๊ณ ์๋ฃ