๊ธฐ์กด JavaScript์์๋ var๋ฅผ ์ด์ฉํ์ฌ ๋ณ์ ์ ์ธ์ ํ๋ค.
๊ทธ ํ ES6์์ let๊ณผ const๊ฐ ์ถ๊ฐ๋์๊ณ , ์ด ๋์ ์ฌ์ฉ์ ๊ถ์ฅํ๊ณ ์๋ค.
๊ทธ๋ผ ์ var๋ฅผ ๋๊ณ let๊ณผ const๊ฐ ๋์๊ณ , ์ด ๋์ ์ฌ์ฉ์ ๊ถ์ฅํ๋ ๊ฒ์ผ๊น?
1. var์ ๋จ์
๋จผ์ var ํค์๋๋ ํฌ๊ฒ ๋จ์ ์ธ ๊ฐ์ง๊ฐ ์๋ค.
1. ๋ณ์ ์ค๋ณต ์ ์ธ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์๋์น ์์ ๊ฐ ๋ฐํ์ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
2. ํจ์ ๋ ๋ฒจ ์ค์ฝํ ๋๋ฌธ์ ํจ์ ์ธ๋ถ์์ ์ ์ธ๋ ๋ณ์๋ ์ ์ญ ๋ณ์๊ฐ ๋๋ค.
3. ๋ณ์ ์ ์ธ ์ด์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋๋ผ๋ undefined๊ฐ ๋ฐํ๋๋ค.
ES6์์ ๋์จ let, const ํค์๋๋ ์ ์ธ ๊ฐ์ง ๋จ์ ์ ํด๊ฒฐํด์ค๋ค.
2. ๋ณ์ ์ ์ธ ๋ฐฉ์ ์ฐจ์ด
1. var (์ค๋ณต ์ ์ธ O)
var name = 'apple'
console.log(name) // apple
var name = 'orange'
console.log(name) // orange
์ค๋ณต ์ ์ธ ๊ฐ๋ฅ
์ ๋ํ
์คํธ ๋จ๊ณ์์๋ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ๋ณผ ์ ์์ผ๋ ํธ๋ฆฌํ์ง๋ง,
์ฝ๋๊ฐ ๋ง์์ง๋ฉด ์ด๋์์ ์ธ์ ์ด๋ป๊ฒ ์ ์ธ์ด ๋์๋์ง ํ์
ํ๊ธฐ ํ๋ค๊ณ
์๋ํ์ง ์์ ๊ฐ์ด ํ ๋น ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
2. let (์ค๋ณต ์ ์ธ X, ์ฌํ ๋น O)
let name = 'apple'
console.log(name) // apple
let name = 'orange'
console.log(name) // Uncaught SyntaxError: Identifier 'name' has already been declared
์ค๋ณต ์ ์ธ ๋ถ๊ฐ๋ฅ
let name = 'apple'
console.log(name) // apple
name = 'orange'
console.log(name) // orange
์ฌํ ๋น ๊ฐ๋ฅ
3. const (์ ์ธ๊ณผ ์ด๊ธฐํ ๋์ ์งํ, ์ค๋ณต ์ ์ธ X, ์์๊ฐ ์ฌํ ๋น X, ๊ฐ์ฒด ์ฌํ ๋น O)
const name; // output: Uncaught SyntaxError: Missing initializer in const declaration
const name = 'apple'
์ ์ธ๊ณผ ์ด๊ธฐํ ๋์ ์งํ
const name = 'apple'
console.log(name) // apple
const name = 'orange'
console.log(name) // Uncaught SyntaxError: Identifier 'name' has already been declared
์ค๋ณต ์ ์ธ ๋ถ๊ฐ๋ฅ
const name = 'apple'
console.log(name) // apple
name = 'orange'
console.log(name) // Uncaught TypeError: Assignment to constant variable.
์์๊ฐ ์ฌํ ๋น ๋ถ๊ฐ๋ฅ
const name = { one: 'apple' }
name.one = 'orange'
console.log(name) // { one: 'orange' }
๊ฐ์ฒด ์ฌํ ๋น ๊ฐ๋ฅ
3. ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ ์ฐจ์ด
1. var
var a = 1
if (true) {
var a = 2
}
console.log(a) // 2
ํจ์ ์ธ๋ถ์์ var ํค์๋๋ฅผ ์ฌ์ฉํด a๋ฅผ ์ ์ธํ๋ฉด ์ด๋ ์ ์ญ ๋ณ์๊ฐ ๋๋ค.
if๋ฌธ ์์์ a๊ฐ ์ค๋ณต ์ ์ธ๋๊ณ , ์ถ๋ ฅ๊ฐ์ 2๋ก ๋ฐ๋๊ฒ ๋๋ค.
์ค๋ฌด ํ๋ก์ ํธ์ ๊ธด ์ฝ๋๋ค์์ ์ด๋ฐ ์ํฉ์ด ์จ๋ค๋ฉด, ์๋์น ์์ ๊ฐ์ด ์ถ๋ ฅ๋๊ฒ ๋๋ค.
2. let, const
// const ํค์๋๋ ๋์ผ
let a = 1
if (true) {
let a = 2
}
console.log(a) // 1
var ํค์๋๋ก ์ ์ธํ์ ๋, ์ถ๋ ฅ๊ฐ์ด 2์์ง๋ง
let, const๋ก ํจ์ ์์ ์ ์ธํ๊ฒ ๋๋ฉด ์ง์ญ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ค.
๊ทธ๋์ ์ ์ญ์์ ์ถ๋ ฅํ๋ฉด ์ ์ญ์ ์๋ 1์ด ์ถ๋ ฅ๋๋ค.
4. ํธ์ด์คํ
์ฐจ์ด
1. var
console.log(name); // undefined
var name;
var ํค์๋๋ก ์ ์ธํ ๋ณ์๋ ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ๋์์ ์งํ๋์ด
name์ ์๋ฌต์ ์ผ๋ก undefined๋ฅผ ํ ๋นํ์ฌ ์ด๊ธฐํ๋๋ค.
๋ณ์ ์ ์ธ์ด ๋ฐํ์์ ๋๋๊ฒ ์๋๋ผ, ๊ทธ ์ด์ ๋จ๊ณ์์ ๋จผ์ ์งํ๋๊ธฐ ๋๋ฌธ์
var ํค์๋์ ๊ฐ์ ํ ๋นํ์ง ์์ผ๋ฉด ์ธ์ ๋ undefined๋ฅผ ๋ฐํํ๋ค.
๋ณ์ ์์ฑ ๋จ๊ณ : ์ ์ธ ๋จ๊ณ > ์ด๊ธฐํ ๋จ๊ณ > ํ ๋น ๋จ๊ณ
2. let
console.log(name); // Uncaught ReferenceError: name is not defined
let name;
let ํค์๋๋ก ์ ์ธํ ๋ณ์๋ ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ๋ถ๋ฆฌ๋์ด ์งํ๋๋ค.
๋ฐํ์ ์ด์ ์ ์ ์ธ ๋จ๊ณ๊ฐ ์คํ๋์ง๋ง ์ด๊ธฐํ ๋จ๊ณ๊ฐ ์คํ๋๊ธฐ ์ ์ ๋ณ์์ ์ ๊ทผํ๋ฉด
์์ง ์ ์๋์ง ์์๋ค๋ ์ฐธ์กฐ ์ค๋ฅ ๋ฉ์ธ์ง๊ฐ ๋ฌ๋ค.
๊ทธ๋์ let ํค์๋๋ก ์ ์ธํ ๋ณ์๋ ์ค์ฝํ์ ์์ ์ง์ ๋ถํฐ ์ด๊ธฐํ ๋จ๊ณ ์์ ์ง์ ๊น์ง
๋ณ์ ์ฐธ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ ์ผ์์ ์ฌ๊ฐ์ง๋(Temporal Dead Zone; TDZ) ๊ตฌ๊ฐ์ ์กด์ฌํ๊ฒ ๋๋ค.
3. const
console.log(constName) // Uncaught ReferenceError: Cannot access 'constName' before initialization
const constName = 'apple'
const ํค์๋๋ก ์ ์ธํ ๋ณ์๋ ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ๋์์ ์งํ๋๋ค.
๋ฐํ์ ์ด์ ์๋ ์คํ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ ๋์ง ์์ ์ํ๋ผ
์ ๊ทผ ์ค๋ฅ ๋ฉ์ธ์ง๊ฐ ๋ฌ๋ค.