-
let & constTIL/ES6+ 2020. 12. 1. 23:43
๐ค ES6?
ES6๋ ECMA2015 ๋ฒ์ ์ผ๋ก, 2009๋ ์ ๋์จ ES5์์ Arrow function, map, filter ๋ฑ์ด ์ถ๊ฐ๋๋ฉฐ ํฐ ํญ์ ๋ณํ๊ฐ ์๊ธด ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ์ ์ด๋ค.
ES6๋ก๋ ๋ ์ฝ๊ณ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋๋ฅผ ์งค ์ ์์ผ๋ฉฐ ์์์ ์ ์ ์ธ๊ธํ๋ค์ํผ Class, Module, Arrow function, let & const, ๋น๊ตฌ์กฐํ ํ ๋น, Promise ๋ฑ ์ถ๊ฐ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋ค.๐ฐ ES6 ์ด์ ์ ๋ณ์๋ค
let
๊ณผconst
๊ฐ ์๊ธฐ๊ธฐ ์ด์ ์var
๋ผ๋ ์์ฝ์ด๊ฐ ์์๋ค.var
๋ ํ ๋ฒ ์ ์ธํ๋ฉด ํจ์, ๋ธ๋ก์ ๊ด๊ณ์์ด ์ ์ญ์์ ์ฌ์ฉํ ์ ์๋ ๋ฒ์๋ฅผ ๊ฐ์ ธ ์ธ์ ์ด๋์์ ์ด๋ป๊ฒ ๊ฐ์ด ๋ณ๊ฒฝ๋์๋์ง ์๊ธฐ ํ๋ค๋ค. ์ด๋ ๊ฒ ๋ณ์์ scope๊ฐ ์ ์ญ์ด๊ณ hoisiting์ด ์ผ์ด๋๋ค๋ฉด ํฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์ ํ์ ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค. ๋ฌผ๋ก ์ ์ญ์์ ์ฌ์ ์ํ๊ฑฐ๋ ๊ฐ์ ๋ฎ์ด์ธ ๋๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๊ฒ ์ง๋ง ์ด๋ฐ ๋ก์ง์ ๊ตฌํํ์ง ์๋ ๊ฒ์ด ์ฝ๋์ ํ์ง์ ์ข๋ค.
์ด๋ฐvar
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๊ถ๊ทน์ ์ผ๋ก ๊ฐ๋ฐ์์ ์ค์๋ฅผ ์ค์ฌ์ฃผ๋let
๊ณผconst
๊ฐ ๋ฑ์ฅํ์๋ค.
let
#block-level scope | #temporal dead zone | #hoisting
block-level scope
let
์ block-level scope๋ฅผ ๊ฐ์ง๋ค. ์ฌ๊ธฐ์์ block-level scope๋{}
๋ก ์ด๋ฃจ์ด์ง ๋ธ๋ก - if, else, for, try-catch, while ๋ฑ - ์์์๋ง ์ ํจํ๊ฒ ์ฌ์ฉํ ์ ์๋ scope๋ฅผ ๊ฐ์ง๋ค๋ ๋ป์ด๋ค.
๋ธ๋ก์ ๊ฐ์ธ๊ณ ์๋ ๋ธ๋ก์ด๋ ์ ์ญ์ ์ ์ธ๋let
์ ๋ด๋ถ ๋ธ๋ก์์ ํธ์ถํ ์ ์์ง๋ง ๋ค๋ฅธ ๋ธ๋ก์ ์๊ฑฐ๋ ๋ธ๋ก ๋ด๋ถ์ ์๋let
์ ๋ธ๋ก ์ธ๋ถ์์ ํธ์ถํ ์ ์๋ค. ์ด๋ฐ ํน์ง์ผ๋ก ๋ณ์๊ฐ ์ ์ ์๋ ๊ณณ์์ ๋ฐ๋๊ณ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.์ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํ์๋ฉด
A
๋ ์ ์ญ, ๋ธ๋ก A, ๋ธ๋ก B์์ ์ฌ์ฉํ ์ ์๊ณB
๋ ๋ธ๋ก A, ๋ธ๋ก B์์,C
๋ ๋ธ๋ก B์์๋ง ์ฌ์ฉํ ์ ์์ฃ . ๋ง์ฝC
๋ฅผ ๋ธ๋ก B๊ฐ ์๋ ์ ์ญ์ด๋ ๋ธ๋ก A์์ ํธ์ถํ๋ค๋ฉดC is not defined
์ฝ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.temporal dead zone
temporal dead zone์ ๋ณ์๊ฐ ์ ์ธ๋๊ธฐ ์ (
let
) ํน์ ์ ์ธ ๋ฐ ์ด๊ธฐํ ๋๊ธฐ ์ (const
)๊น์ง์ ๊ณต๊ฐ์ ์๋ฏธํ๋ค. ์ด ๊ณต๊ฐ์ C๋ C++์์์ฒ๋ผ ๋ณ์์ ์ฃผ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์๋, scope์ ์ง์ ํ๋ ์์ ๋ถํฐ ์ ์ธ ๋๋ ์ ์ธ ๋ฐ ์ด๊ธฐํ๋๊ธฐ ์ ์ ๋ณ์๋ฅผ ํธ์ถํ๋ ๊ณณ๊น์ง์ period๋ฅผ ์๋ฏธํ๋ค.let a = 'out A'; function blockA() { console.log(a); let a = 'in A'; }
์์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ํ ๋,
blockA()
๋ฅผ ํธ์ถํ๋ฉด out A๊ฐ ์ถ๋ ฅ๋ ๊ฒ ๊ฐ์ง๋ง ReferenceError๊ฐ ์ถ๋ ฅ๋๋ค. ๋ธ๋ก ์ค ํ๋์ธfunction
์์์a
๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ฅ์ด ๋ธ๋ก ๋ด์a
๋ฅผ ์ ์ธํ๋ ๋ฌธ์ฅ๋ณด๋ค ์์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋, temporal dead zone(TDZ)์ ๋ธ๋ก ๋ด๋ถ์์a
๋ฅผ ์ ์ธํ๋ ๋ฌธ์ฅ์์ ๋๋๊ฒ ๋๋ค.hoisting
var
๋ฅผ ์ฌ์ฉํ๋ฉด hoisting์ด ์ผ์ด๋ ๋ณ์์ ์ ์ธ๋ถ๊ฐ ํ๋ก๊ทธ๋จ์ ์๋ก ๋์ด์ฌ๋ ค์ง๋ค.console.log(captain); var captain = 'Kirk';
์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ณ์์ ์ ์ธ๋ถ์ธ
var captain
์ด ๊ฐ์ฅ ์๋ก ๋์ด์ฌ๋ ค์ ธvar captain; console.log(captain); // undefined captain = 'Kirk';
์ ๊ฐ์ ํํ๊ฐ ๋๋ฏ๋ก
console.log
์์undefined
๊ฐ ์ถ๋ ฅ๋๋ค. ์ ์ธ์ ํ์ผ๋ ์ด๊ธฐํ๊ฐ ๋์ง ์์ ์ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฐ ์ฝ๋๊ฐ ๋ค์ด์๋ค๋ฉด ์๊ธฐ์น ๋ชปํ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ํ์ด ๋์์ง๋ค.let
์์๋ ์ด๋ ๊ฒ ์ ์ธ๋ถ๋ฅผ ์๋ก ๋์ด์ฌ๋ฆฌ๋ hoisting์ด ์ผ์ด๋์ง ์์console.log(captain); let captain = 'Kirk';
์์ ์ฝ๋๋ฅผ ์คํํ์ ๋
captain is not defined
์ค๋ฅ๊ฐ ์ฝ์์ ๋ํ๋๋ค.const
#block-level scope | #hoisting | #์์
const
๋let
๊ณผ ์ ์ฌํ ์ ์ด ๋ง๋ค. block-level scope๋ฅผ ๊ฐ์ง๊ณ hoisting์ด ๋์ง ์์ ๋ณ์ ์ ์ธ ์ ์ ๋ณ์๋ฅผ ํธ์ถํ๋ฉด Cannot access 'xxx' before initialization ์ค๋ฅ๋ฅผ ์ถ๋ ฅํ๋ฉฐ ์คํ๋์ง ์๋๋ค.const
์ ๊ฐ์ฅ ํฌ๊ณ ์ค์ํ ์ฐจ์ด์ ์ ๋ณํ์ง ์๋ ์์๋ผ๋ ์ ์ด๋ค.const captain = 'Kirk'; captain = 'Sulu';
const
๋กcaptain
์ ์ ์ํ๊ณ ๊ฐ์ ์ด๊ธฐํํ๋ค.captain
์ด 'Sulu'๋ก ๋ฐ๋๊น?var
๋let
์ด๋ผ๋ฉด ๋ฐ๋์๊ฒ ์ง๋ง ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด'captain' is read-only
๋ผ๋ ์ค๋ฅ๊ฐ ๋ฌ๋ค. ์ฆ,const
๋ก ์ด๊ธฐํ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๋ป์ด๋ค.โ๊ทธ๋ผ ํน์ ์ด๊ธฐํ ์์ด ์ ์ธ๋ง ํ๋ฉด undefined ์์ฒด๋ก ์์ํ๋๋์?
โ๏ธ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๊ฐ๋ณด๋ค ๋๋ํฉ๋๋ค! const๋ก ์ ์ธํ๊ณ ์ด๊ธฐํํ์ง ์์ผ๋ฉด Missing initializer in const declaration ๋ผ๋ ์๋ฌ๋ฅผ ๋ณด์ฌ์ฃผ๋ฉฐ const์ ์ด๊ธฐํ๊ฐ ๋์ง ์์๋ค๊ณ ์๋ ค์ค๋๋ค.ํ์ง๋ง
const
๋ก Object๋ Array๋ฅผ ์ ์ธํ์ ๋๋ ๋ฌ๋ผ์ง๋ค.const starships = { first: 'Enterprise', second: 'Discovery', third: 'Franklin' }; starships.first = 'Star Destroyer';
์ด๋ ๊ฒ
starships
Object๋ฅผ ์ ์ธํ ํ ํฌํจ๋์ด ์๋ ๋ฐ์ดํฐfirst
๋ฅผ ๋ฐ๊ฟ๋ณด์.const
๋ ์์์ด๋ ๋ฐ๋๋ฉด ์ ๋์ง๋ง... ๐ฑ ์ด๋ด ์๊ฐfirst
๊ฐ Star destroyer๋ก ๋ฐ๋์ด๋ฒ๋ฆฐ๋ค! ์ค๋ฅ๋ ๊ฒฝ๊ณ ๋ ์์ด!
์ด์ ๋ ์๊ฐ๋ณด๋ค ๊ฐ๋จํ๋ค. JavaScript์ Object๋ Array๋ ์ฐธ์กฐ๊ฐ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ,const starships
๊ฐ ๊ฐ๊ณ ์๋ ๊ฐ์ ๊ฐ์ฒด ์์ฒด๊ฐ ์๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๊ณต๊ฐ์ ์ฃผ์๋ฅผ ์ ์ฅํ๊ณ ์๋ ์ ์ด๋ค. (C๋ C++์ ํฌ์ธํฐ๋ฅผ ์๊ณ ์๋ค๋ฉด ์ดํด๊ฐ ์ฌ์ธ ๊ฒ์ด๋ค.)
๋ฐ๋ผ์ Object๋ Array ๋ณ์๊ฐ ๊ฐ๊ณ ์๋ ์ฐธ์กฐ๊ฐ์ ๋ฐ๊พธ์ง ์๋ ๋ด๋ถ ๊ฐ์.
์ฐ์ฐ์๋[n]
์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ผ๋,const newStarships = { first: 'Star destroyer' }; starships = newStarships; starships = { first: 'Star destroyer' };
์ด๋ ๊ฒ ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐ๊ฟ ์๋ ์๋ค. ๋ง์ฝ ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ค๋ฉด Assignment to constant variable ์ค๋ฅ๋ฅผ ๋ง๋๊ฒ ๋๋ค.
์๊ธ
astrogrammer.log - ES6 - let & const์ฐธ๊ณ
velog - [ES6] Hoisting & Temporal Dead Zone(TDZ)
Toast UI - TDZ์ ๋ชจ๋ฅธ ์ฑ ์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ๋ง๋ผ'TIL > ES6+' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Default Value & Destructuring (0) 2021.01.02 Array Function2 (0) 2020.12.10 Array Function (0) 2020.12.07 For Loop (0) 2020.12.05 Arrow Function (0) 2020.12.03