JavaScript Visualized: ๐ฅ๐บ๐ผ Hoisting
Posted on September 01, 2020ย - ย 3 min readreference: https://dev.to/lydiahallie/javascript-visualized-hoisting-478h
ํธ์ด์คํ ์ ๋ชจ๋ JavaScript ๊ฐ๋ฐ์๋ค์ด ์ง์ฆ๋๋ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ฌ StackOverflow๊น์ง ๊ตฌ๊ธ๋งํ์ ๋ ๋ฃ๊ฒ ๋๋ ์ฉ์ด ์ค ํ๋์ ๋๋ค.๐ ๊ทธ๋ผ, ํธ์ด์คํ ์ด ๋ญ๊ฐ์? (์ฐธ๊ณ - ์ค์ฝํ๋ ๋ค๋ฅธ ํฌ์คํธ์์ ๋ค๋ค์ง ๊ฒ์ ๋๋ค. ์ ํฌ์คํธ๋ฅผ ๊ฐ๋ฅํ ํ๋์ ์ฃผ์ ๋ก ์ง์ค์ํค๊ณ ์ถ์ด์)
๋ง์ฝ ์ฌ๋ฌ๋ถ๋ค์ด JavaScript๊ฐ ์ฒ์์ด๋ผ๋ฉด, ์ด๋ค ๋ณ์๋ค์ด ์์๋ก undefined
, ReferenceError
๋ฅผ ๋ด๋ ๋ฑ์ โ์ด์ํโ ํ๋์ ํ๋ ๊ฑธ ๋ณด์
จ์ ๊ฑฐ์์. ํธ์ด์คํ
์ ์ข
์ข
๋ณ์์ ํจ์๊ฐ ํ์ผ์ ์๋จ์ ๋์ฌ์ง๋ ๊ฒ์ผ๋ก์จ ์ค๋ช
๋ฉ๋๋ค๋ง ๊ทธ๊ฒ ์๋์ฃ . ์ค์ ๋ก ์ผ์ด๋๋ ์ผ์ ๊ทธ๊ฒ ์๋๋๋ค. ์ค์ ๋ก ๊ทธ๋ ๊ฒ ๋๋ ๊ฒ ๊ฐ์ด ๋ณด์ด๋๋ผ๋ ๋ง์ด์์. ๐
JavaScript ์์ง์ด script๋ฅผ ํด์ํ ๋, ๊ฐ์ฅ ๋จผ์ ํ๋ ๊ฒ์ ์ฝ๋ ๋ด์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธํ ํ๋ ๊ฒ์ ๋๋ค. ์ด ์์ ์์๋ ์ฝ๋๊ฐ ์คํ๋์ง ์๊ณ , ์คํ์ ์ํ ๋ชจ๋ ์ค๋น๋ง ํ๋ ๋จ๊ณ์ด๊ณ , ํจ์ ์ ์ธ๊ณผ ๋ณ์๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฆ ๋๋ค. ํจ์๋ ํจ์ ์ ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
1 || ํจ์๋ ํจ์ ์ ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
๋ณ์๋ ์ฝ๊ฐ ๋ค๋ฆ
๋๋ค. ES6๋ ์๋ก์ด 2๊ฐ์ ํค์๋๋ฅผ ์๊ฐํ๋๋ฐ์: let
๊ณผ const
์
๋๋ค. let
์ด๋ const
ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ uninitialized๋ก ์ ์ฅ๋ฉ๋๋ค.
2 || let๊ณผ const ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ uninitialized๋ก ์ ์ฅ๋ฉ๋๋ค. (ES6 classes๋ฅผ ํฌํจ)
var
ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ๊ธฐ๋ณธ ๊ฐ์ด undefined
๋ก ์ ์ฅ๋ฉ๋๋ค.
3 || var ํค์๋๋ก ์ ์ฅ๋ ๋ณ์๋ ๊ธฐ๋ณธ๊ฐ์ด undefined์ ๋๋ค.
์ด์ ์์ฑ ๋จ๊ณ๊ฐ ๋๋ฌ์ต๋๋ค. ์ด์ ์ค์ ๋ก ์ฝ๋๋ฅผ ์คํํ ์ ์๊ฒ ๋์ฃ . ์ด๋ค ํจ์๋ ๋ณ์๊ฐ ์ ์ธ๋๊ธฐ ์ ์ ํ์ผ์ ์๋จ์ ์๋ 3๊ฐ์ console.log
๊ฐ ์๋ค๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์ง ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํจ์๋ ํจ์์ ์ ์ฒด ์ฝ๋์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์, ๊ทธ๊ฒ๋ค์ด ์์ฑ๋๊ธฐ ์ด์ ์ด๋๋ผ๋ ์ฐ๋ฆฐ ๊ทธ๊ฑธ ํธ์ถํ ์ ์์ต๋๋ค. ๐ฅ
4 || ์คํ ๋จ๊ณ์์, ๋ฉ๋ชจ๋ฆฌ์ ํจ์ ์ ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฐ ์ ์ธ๋์ง ์์ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
์ ์ธ ์ ์ var
ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ ๋, ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅ๋ ๊ธฐ๋ณธ ๊ฐ์ ๋ฐํํ ๊ฒ์
๋๋ค: undefined
! ๊ทธ๋ฌ๋, ์ด๊ฑด ๋๋๋ก โunexpectedโ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๊ฒ์ ์๋ํ์ง ์์ ์ฐธ์กฐ๋ฅผ ๋ปํฉ๋๋ค. (์๋ง ์ค์ ๋ก undefined
๋ผ๋ ๊ฐ์ ์ํ์ง ์์๊ฑฐ์์) ๐ฌ
5 || var ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ฅผ ์ ์ธ ์ ์ ์ฐธ์กฐํ ๋, ๊ทธ๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ undefined๊ฐ ๋ฉ๋๋ค.
var
ํค์๋์ผ ๋์ฒ๋ผ, ์ค์๋ก undefined
๋ฅผ ์ฐธ์กฐํ๋ ์ํฉ์ ๋ง๊ธฐ ์ํด, uninitialized ๋ณ์์ ์ ๊ทผํ๋ ค ํ ๋๋ ReferenceError
๊ฐ ๋ฐ์ํฉ๋๋ค. ์ค์ ์ ์ธ ์ ์ โ์์ญโ์ ์ผ์์ ์ฌ๊ฐ์ง๋๋ผ๊ณ ๋ถ๋ฆ
๋๋ค: ๊ทธ๊ฒ์ ์ด๊ธฐํ ์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๊ฑฐ์ฃ (ES6์ class ๋ํ ํฌํจ๋ฉ๋๋ค!)
6 || ๋ณ์์ ์ ์ธ ์ ์ unnitialized๋ฅผ ์ฐธ์กฐํ๋ ค๊ณ ํ ๋ ReferenceError๊ฐ ๋ฐ์ํฉ๋๋ค.
์ค์ ๋ณ์๋ฅผ ์ ์ธํ๋ ๋ผ์ธ์ด ์์ง์ ์ ๋ฌ๋๋ฉด, ๋ฉ๋ชจ๋ฆฌ ๋ด์ ๊ฐ์ด ์ค์ ๋ก ์ ์ธ๋ ๊ฐ์ผ๋ก ๋ฎ์ด์์์ง๋๋ค.
(๊ทธ๋ฆผ ๋ด ์ซ์๊ฐ 7์ด ๋์ด์ผ ํ๋ค์. ๊ณง ์ ๋ฐ์ดํธ ํ ๊ป์ ๐ฌ)
7 || ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ๋ณ์๊ฐ ์ ์ธ๋ ๋ผ์ธ์ด ์ ๋ฌ ๋๋ฉด ๋ฎ์ด์์์ง๋๋ค.
๋ค ๋๋ฌ์ต๋๋ค! ๐ ์ ๋ฆฌํด๋ณด์ฃ :
- ํจ์์ ๋ณ์๋ ์ค์ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์คํ ์ปจํ ์คํธ๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ฉ๋๋ค. ์ด๋ฅผ ํธ์ด์คํ ์ด๋ผ๊ณ ํฉ๋๋ค.
- ํจ์๋ ํจ์ ์ ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๊ณ ,
var
ํค์๋์ ๋ณ์๋undefined
๋ก,let
๊ณผconst
ํค์๋๋ก ๋ ๋ณ์๋ uninitialized๋ก ์ ์ฅ๋ฉ๋๋ค.
์ค์ ์ฝ๋๊ฐ ์คํ ๋ ๋ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ๋ดค๊ธฐ ๋๋ฌธ์, ์ด์ ํธ์ด์คํ ์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ข ๋ ์ดํดํ์ จ๊ธธ ๋ฐ๋๋๋ค. ์ธ์ ๋ ๊ทธ๋ ๋ฏ ์์ ํ ๋๋์ด ์ค์ง ์๋๋ผ๋ ๊ฑฑ์ ๋ง์ธ์. ์ค์ ๋ก ํด๋ณผ์๋ก ๋ ์ต์ํด์ง์ค ๊ฒ๋๋ค. ๊ถ๊ธํ ์ ์์ผ์๋ฉด ์ธ์ ๋ ์ฐ๋ฝ์ฃผ์ธ์. ๐