JS Hoisting
Table of contents
์๋ฐ์คํฌ๋ฆฝํธ์ ํธ์ด์คํ (Hoisting)
ํธ์ด์คํ (hoisting)์ด๋ ์ ์ธ๋ฌธ์ ์ค์ฝํ(scope)์ ์ ๋๋ก ์ฎ๊ธด ๊ฒ์ฒ๋ผ ๋์ํ๋ ํน์ฑ ์ผ๋ก ์ค์ฝํ ๋จ์๋ก ์ผ์ด๋๋ค.
๋ชจ๋ ์ ์ธ๋ฌธ(var, let, const, function, function*, class)์ ๋ฐํ์ ์ด์ ๋จ๊ณ์์ ๋จผ์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ ์ธ๋๊ธฐ ์ด์ ์ ์ฐธ์กฐ ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง let, const, class๋ ํธ์ด์คํ ์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋์ํ๊ณ ์ ์ธ๋๊ธฐ ์ด์ ์ ์ฐธ์กฐํ๋ ค ํ๋ฉด ReferenceError๊ฐ ๋ฐ์ํ๋ค.
ํธ์ด์คํ ์ด ๋ฐ์ํ๋ ์ด์
๋ชจ๋ ์ ์ธ๋ฌธ์ ๋ฐํ์ ์ด์ ์ ์ฝ๋ ํ๊ฐ ๊ณผ์ ์์ ์คํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ฝ๋ ์คํ์ ์ํ ์ค๋น ๋จ๊ณ์ธ ์ฝ๋์ ํ๊ฐ ๊ณผ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ชจ๋ ์ ์ธ๋ฌธ์ ์ฝ๋์์ ์ฐพ์๋ด์ด ๋จผ์ ์คํํ๊ณ , ์ฝ๋์ ํ๊ฐ ๊ณผ์ ์ด ๋๋๋ฉด ๋ชจ๋ ์ ์ธ๋ฌธ์ ์ ์ธํ๊ณ ์ฝ๋๋ฅผ ํ ์ค์ฉ ์์ฐจ์ ์ผ๋ก ์คํํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ ์ธ๋ฌธ์ด ์ฝ๋ ์ด๋์ ์๋ ์๊ด ์์ด ๋ค๋ฅธ ์ฝ๋๋ณด๋ค ๋จผ์ ์คํํ๊ธฐ ๋๋ฌธ์ ์ ์ธ๋ฌธ์ด ์ด๋์ ์์นํ๋์ง์ ์๊ด์์ด ์ฐธ์กฐํ ์ ์๋ค.
๋ณ์ ํธ์ด์คํ (Variable hoisting)
๋ณ์ ์ ์ธ๋ฌธ์ด ์ฝ๋์ ์ ๋๋ก ๋์ด ์ฌ๋ ค์ง ๊ฒ์ฒ๋ผ ๋์ํ๋ ๊ฒ์ ๋ณ์ ํธ์ด์คํ ์ด๋ผ ํ๋ค.
๋ณ์๊ฐ ์์ฑ๋๋ 3๋จ๊ณ
์ ์ธ ๋จ๊ณ(Declaration phase)
๋ณ์๋ฅผ ์คํ ์ปจํ ์คํธ์ ๋ณ์ ๊ฐ์ฒด(Variable object)์ ๋ฑ๋กํ๋ค. ์ด ๋ณ์ ๊ฐ์ฒด๋ scope๊ฐ ์ฐธ์กฐํ๋ ๋์์ด ๋๋ค.
์ด๊ธฐํ ๋จ๊ณ(Initialization phase)
๋ณ์ ๊ฐ์ฒด(Variable object)์ ๋ฑ๋ก๋ ๋ณ์๋ฅผ ์ํ ๊ณต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ํ๋ณดํ๋ค. ์ด ๋จ๊ณ์์ ๋ณ์๋ undefined๋ก ์ด๊ธฐํ๋๋ค.
ํ ๋น ๋จ๊ณ(Assignmnet phase)
undifined๋ก ์ด๊ธฐํ๋ ๋ณ์์ ์ค์ ๊ฐ์ ํ ๋นํ๋ค.
var ํค์๋๋ก ์ ์ธ๋ ๋ณ์
var
ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ๋ณ์ ์ ์ธ๋ฌธ ์ด์ ์ ๋ณ์์ ์ฐธ์กฐํ์ฌ๋ ๋ณ์ ๊ฐ์ฒด(variable object)์ ๋ณ์๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ReferenceError๊ฐ ๋ฐ์ํ์ง ์๊ณ undefined
๋ฅผ ๋ฐํํ๋ค.
let, const ํค์๋๋ก ์ ์ธ๋ ๋ณ์
let, const ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ '์ ์ธ ๋จ๊ณ'์ '์ด๊ธฐํ ๋จ๊ณ'๊ฐ ๋ถ๋ฆฌ๋์ด ์งํ๋๊ธฐ ๋๋ฌธ์ ํธ์ด์คํ ์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ค.
์ฝ๋๊ฐ ํ๊ฐ๋๋ ๊ณผ์ ์์ ์๋ณ์๋ฅผ ๋ฑ๋กํ๋ ์ ์ธ ๋จ๊ณ๋ ์คํ๋์ง๋ง, ์ด๊ธฐํ ๋จ๊ณ๋ ๋ณ์ ์ ์ธ๋ฌธ์ ๋๋ฌํ์ ๋ ์คํ๋๋ค.
ํจ์ ํธ์ด์คํ (Function hoisting)
ํจ์ ์ ์ธ๋ฌธ์ด ์ฝ๋์ ์ ๋๋ก ๋์ด ์ฌ๋ ค์ง ๊ฒ์ฒ๋ผ ๋์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ณ ์ ์ ํน์ง์ ํจ์ ํธ์ด์คํ ์ด๋ผ ํ๋ค.
ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ์ ์ํ ํจ์๋ ํจ์ ์ ์ธ๋ฌธ ์ด์ ์ ํธ์ถํ ์ ์๋ค
ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ํจ์๋ฅผ ์ ์ํ๋ฉด ๋ฐํ์ ์ด์ ์ฝ๋ ํ๊ฐ ๊ณผ์ ์์ ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ ์ญ ๊ฐ์ฒด์ ํจ์ ์ด๋ฆ๊ณผ ๋์ผํ ์๋ณ์๋ฅผ ๋ฑ๋กํ๊ณ ์์ฑ๋ ํจ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค.
๊ฐ์ฒด ํ๊ฒฝ ๋ ์ฝ๋์ ๋ฐ์ธ๋ฉ๋ BindingObject๋ฅผ ํตํด ์ ์ญ ๊ฐ์ฒด์ ์๋ณ์๋ฅผ ํค๋ก ๋ฑ๋กํ๋ค.
๋ฐํ์ ๋จ๊ณ์์ ์ด๋ฏธ ํจ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ์๋ณ์์ ๋ฐ์ธ๋ฉ๊น์ง ์๋ฃ๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ํจ์ ์ ์ธ๋ฌธ ์ด์ ์ ์ฐธ์กฐํ ์ ์๊ณ ํธ์ถ๋ ๊ฐ๋ฅํ๋ค.
ํจ์ ํํ์์ผ๋ก ์ ์ํ ํจ์๋ ํจ์ ํํ์ ์ด์ ์ ํธ์ถํ ์ ์๋ค
ํจ์ ํํ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ๋ฉด ํจ์ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ ๊ฒ์ด ์๋๋ผ ๋ณ์ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ค.
ํจ์ ํํ์์ ํจ์ ๋ฆฌํฐ๋ด์ ๋ณ์์ ํ ๋นํ๋ ๊ฒ์ด๋ค. ๋ณ์ ํ ๋น๋ฌธ์ ๊ฐ์ ํ ๋น๋ฌธ์ด ์คํ๋๋ ์์ ์ธ ๋ฐํ์์ ํ๊ฐ๋๋ฏ๋ก ํจ์ ํํ์์ ํจ์ ๋ฆฌํฐ๋ด๋ ํ ๋น๋ฌธ์ด ์คํ๋๋ ์์ ์ ํ๊ฐ๋๋ ํจ์ ๊ฐ์ฒด๊ฐ ๋๋ค.
ํจ์๋ ํจ์ ํํ์์ผ๋ก
ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ์ ์ํ ํจ์์ ํจ์ ํํ์์ผ๋ก ์ ์ํ ํจ์ ๋๋ค ํธ์ด์คํ ์ ๋ฐ์ํ์ง๋ง ์์ฑ ์์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค.
ํจ์ ํธ์ด์คํ ์ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ๋ฐ๋์ ํจ์๋ฅผ ์ ์ธํด์ผ ํ๋ค๋ ๋น์ฐํ ๊ท์น์ ๋ฌด์ํ๊ธฐ ๋๋ฌธ์ ํจ์ ์ ์ธ๋ฌธ ๋์ ํจ์ ํํ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋ณ์ ํธ์ด์คํ ๊ณผ ํจ์ ํธ์ด์คํ
๋ณ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ์ ์ธ๋ฌธ์ ๋ฐํ์ ์ด์ ์ฝ๋ ํ๊ฐ ๋จ๊ณ์์ ๋จผ์ ์คํ๋๊ณ ์๋ณ์๋ฅผ ์์ฑ, ๊ฐ์ฒด ํ๊ฒฝ ๋ ์ฝ๋์ ๋ฐ์ธ๋ฉ๋ BindingObject๋ฅผ ํตํด ์ ์ญ ๊ฐ์ฒด์ ์๋ณ์๋ฅผ ํค๋ก ๋ฑ๋ก ํ๋ค๋ ์ ์ ๊ฐ๋ค. ํ์ง๋ง, var ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ undefined
๋ก ์ด๊ธฐํ๋๊ณ , ํจ์ ์ ์ธ๋ฌธ์ ํตํด ์๋ฌต์ ์ผ๋ก ์์ฑ๋ ์๋ณ์๋ ํจ์ ๊ฐ์ฒด๋ก ์ด๊ธฐํ๋๋ค.
var ํค์๋๋ฅผ ์ฌ์ฉํ ๋ณ์ ์ ์ธ๋ฌธ ์ด์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด ๋ณ์ ํธ์ด์คํ ์ ์ํด undefiend๋ก ํ๊ฐ๋๋ค.
ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ์ ์ํ ํจ์๋ฅผ ํจ์ ์ ์ธ๋ฌธ ์ด์ ์ ํธ์ถํ๋ฉด ํจ์ ํธ์ด์คํ ์ ์ํด ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.