๐ก var, let, const์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์?
day : 2022.02.16
javascript์๋ var, let, const ์ ์ธ๊ฐ์ง ๋ณ์ ์ ์ธ ๋ฐฉ์์ด ์กด์ฌํ๋ค.
es6์ด์ ์๋ var๋ง ์์์ง๋ง, es6๋ถํฐ๋ let, const ํค์๋๊ฐ ์ถ๊ฐ๋์๊ณ , var์ด ์๋ ์ด๋ฅผ ์ด์ฉํด ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
์ let, const์ ์ฌ์ฉ์ ๊ถ์ฅํ ๊น์?
์ด๋ฅผ ์๊ธฐ ์ํด์๋ var๊ณผ let, const์ ์ฐจ์ด๋ฅผ ์๋ฉด ์ด์ ๋ฅผ ์์ ์์ต๋๋ค.
1. ๋ณ์ ์ ์ธ ๋ฐฉ์์ ์ฐจ์ด
var์ ๊ฒฝ์ฐ์๋ ๊ฐ์ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ฌ๋ฌ๋ฒ ์ ์ธํ๋ ๊ฒ์ ํ์ฉํฉ๋๋ค.
var name = 'sumi';
var name = 'sumi2';
์ ๊ฐ์ด ๋ณ์ ์ ์ธ์ ์ฌ๋ฌ๋ฒ ํจ์๋ ์๋ฌ๊ฐ ๋จ์ง์๊ณ ๋๋ฒ์งธ ๊ฐ์ผ๋ก name์ ๊ฐ์ด ๋ฎ์ด์์์ง๊ฒ ๋ฉ๋๋ค. ๊ฐ๋จํ ์ฝ๋์์๋ ์ด๋์์ name์ด๋ผ๋ ๋ณ์๊ฐ ์ฌ์ฉ๋์๋์ง ๋ณผ์์์ด ํธํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง, ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ฉด ๋ณ์๊ฐ ์ด๋์์ ์ฌ์ฉ๋์๊ณ ์์ ๋์๋์ง ์๊ธฐ๊ฐ ์ด๋ ค์์ง์ ์์ต๋๋ค.
๊ทธ๋์ es6์์ ์ถ๊ฐ๋ ํค์๋๊ฐ let, const์
๋๋ค.
let, const๋ก ๊ฐ์ ์ด๋ฆ์ ๋ณ์๋ฅผ ๋๋ฒ ์ ์ธํ๋ฉด var๊ณผ ๋ฌ๋ฆฌ ์๋ฌ๊ฐ ๋จ๊ฒ ๋ฉ๋๋ค.
let name = 'sumi'
let name = 'sumi2'; //error
๋ณ์๋ฅผ ์ฌ๋ฌ๋ฒ ์ ์ธ์ด ๋ถ๊ฐ๋ฅ ํ๋ค๋ ์ ์์ let๊ณผ const๋ ๊ณตํต์ ์ ๊ฐ์ง๊ณ ์์ง๋ง
let์ ๋ณ์์ ๊ฐ์ ์ฌํ ๋น์ด ๊ฐ๋ฅํ๊ณ
const๋ ๋ณ์ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
let name = 'sumi';
name = 'sumi2' //ok
const name2 = 'sumi';
name2 = 'sumi2' //error
2. Scope(๋ฒ์)์ ์ฐจ์ด
scope๋ ์๋ณ์(๋ณ์๋ช ๋ฑ)์ ์ ํจ๋ฒ์๋ฅผ ์๋ฏธํ๋ค. ์ ์ธ๋ ์์น์ ๋ฐ๋ผ ์ ํจ๋ฒ์๊ฐ ๋ฌ๋ผ์ง๋๋ฐ,
- ์ ์ญ ์ค์ฝํ : ์ ์ญ์ ์ ์ธ๋์ด, ์ด๋์์๋ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ ๋ณ์
- ์ง์ญ ์ค์ฝํ : ํจ์ ๋ด๋ถ์ ์ ์ธ๋์ด, ์์ ์ ์ง์ญ scope์ ๊ทธ ํ์ scope์์ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ ๋ณ์ ์์ ๋๊ฐ์ง๋ก ๋๋๋ค.
js์์๋ ๋ชจ๋ ์ฝ๋๋ธ๋ญ์ด ์ง์ญ ์ค์ฝํ๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฅผ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ผ๊ณ ํ๋ค. ํ์ง๋ง
varํค์๋๋ก ์ ์ธํ ๋ณ์๋ ํจ์์ ์ฝ๋๋ธ๋ญ๋ง์ ์ง์ญ ์ค์ฝํ๋ก ์ธ์ ํ๊ณ , ์ด๋ฅผ ํจ์๋ ๋ฒจ ์ค์ฝํ๋ผ๊ณ ํ๋ค.
var: ํจ์ ์ฝ๋ ๋ธ๋ก๋ง์ ์ง์ญ์ค์ฝํ๋ก ์ธ์ let,const: ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ง์
์ ์ญ๋ณ์๋ก ์ธํด ์ฌํ ๋น์ด ์ผ์ด๋๊ฑฐ๋ ๋์ผํ ์ด๋ฆ์ผ๋ก ์ธํด ์์์น ๋ชปํ ๋ณ์ ์ค์ฒฉ์ด ์ผ์ด๋ ์ ์๋ ์ํ ๋๋ฌธ์ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ง์ํ๋ let, const ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
3. Hoisting(ํธ์ด์คํ )
js์์ hoisting์ด๋, ์ธํฐํ๋ฆฌํฐ๊ฐ ๋ณ์์ ํจ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ธ ์ ์ ๋ฏธ๋ฆฌ ํ ๋นํ๋ ๊ฒ์ ๋ปํ๋ค.
var๋ก ์ ์ธํ ๋ณ์๋ ํธ์ด์คํ
์ undefined๋ก ๋ณ์๋ฅผ ์ด๊ธฐํ ํ์ง๋ง,
let, const๋ก ์ ์ธํ ๋ณ์๋ ํธ์ด์คํ
์ ๋ณ์๋ฅผ ์ด๊ธฐํ ํ์ง ์๋๋ค.
let,const๋ก ์ ์ธ๋ ๋ณ์๋ฅผ ์ ์ธ๋ฌธ ์ด์ ์ ์ฐธ์กฐํ๊ฒ ๋๋ฉด ์ฐธ์กฐ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.var์ error๊ฐ ๋์ง์์
์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ธ๋ ๋ชจ๋ ๋ณ์๋ค์ ๋ชจ๋ ํธ์ด์คํ ์ด ๋ฐ์ํ๊ฒ ๋๋ค
ํ์ง๋ง varํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ค๊ณผ ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ์ ์๋ ํจ์๋ค๋ง ์ ์ธ ์ด์ ์ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
์ ๋ฆฌ
var
- ๋ณ์ ์ค๋ณต ์ ์ธ์ด ๊ฐ๋ฅ, ๋ณ์ ์ฌํ ๋น ๊ฐ๋ฅ-> ์์ํ์ง ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์๋ค.
- ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ง์ -> ํจ์ ์ธ๋ถ์์
var๋ก ์ ์ธํ ๋ณ์๋ค์ ๋ชจ๋ ์ ์ญ๋ณ์๊ฐ ๋๋ค. - ๋ณ์ ์ ์ธ๋ฌธ ์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด
undefined๋ฅผ ๋ฐํํ๋ค
let
- ๋ณ์ ์ค๋ณต ์ ์ธ ๋ถ๊ฐ, ๋ณ์ ์ฌํ ๋น ๊ฐ๋ฅ
- ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ
const
- ๋ณ์ ์ค๋ณต ์ ์ธ ๋ถ๊ฐ, ๋ณ์ ์ฌํ ๋น ๋ถ๊ฐ๋ฅ
- ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ
- ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ๋ฐ๋์! **์ ์ธ๊ณผ ์ด๊ธฐํ๋ฅผ ๋์์ ์งํํ์ฌ์ผ ํ๋ค. **
- ๋จ, ์ฌํ ๋น์ ๊ฒฝ์ฐ number์ ๊ฐ์ ์์ ๊ฐ์ ์ฌํ ๋น์ด ์๋์ง๋ง, ๊ฐ์ฒด๋ ์ฌํ ๋น์ด ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ์ฌํ ๋น์ ๊ธ์งํ๋ ๊ฒ์ด
const๊ฐ์ฒด๋ โ๋ถ๋ณโ์ด๋ผ๋ ๋ง๊ณผ ๊ฐ์๋ง์ด ์๋๋ค.
๊ฒฐ๋ก
๋ณ์์ ์ค์ฝํ๋ ์ต๋ํ ์๊ฒ ๋ง๋๋ ๊ฒ์ด ์ข์ผ๋ฏ๋ก ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๊ถ์ฅํ๋ค.
๋ณ๊ฒฝํ์ง์๋ ๊ฐ(์์)์ด๋ผ๋ฉด const๋ฅผ ์ด์ฉํด ์ ์ธ, ๊ทธ๋ ์ง ์๊ณ ๋ณ์ ์ฌํ ๋น์ด ์์๊ฒฝ์ฐ let๋ฅผ ์ด์ฉํด ์ ์ธํ์.