/
๐Ÿ“™

JS Hoisting

JavaScript
Table of contents

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ˜ธ์ด์ŠคํŒ…(Hoisting)

ํ˜ธ์ด์ŠคํŒ…(hoisting)์ด๋ž€ ์„ ์–ธ๋ฌธ์„ ์Šค์ฝ”ํ”„(scope)์˜ ์„ ๋‘๋กœ ์˜ฎ๊ธด ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ํŠน์„ฑ ์œผ๋กœ ์Šค์ฝ”ํ”„ ๋‹จ์œ„๋กœ ์ผ์–ด๋‚œ๋‹ค.

๋ชจ๋“  ์„ ์–ธ๋ฌธ(var, let, const, function, function*, class)์€ ๋Ÿฐํƒ€์ž„ ์ด์ „ ๋‹จ๊ณ„์—์„œ ๋จผ์ € ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ๋˜๊ธฐ ์ด์ „์— ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์ง€๋งŒ let, const, class๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ณ  ์„ ์–ธ๋˜๊ธฐ ์ด์ „์— ์ฐธ์กฐํ•˜๋ ค ํ•˜๋ฉด ReferenceError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ 

๋ชจ๋“  ์„ ์–ธ๋ฌธ์€ ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์ฝ”๋“œ ํ‰๊ฐ€ ๊ณผ์ •์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•œ ์ค€๋น„ ๋‹จ๊ณ„์ธ ์ฝ”๋“œ์˜ ํ‰๊ฐ€ ๊ณผ์ •์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋ชจ๋“  ์„ ์–ธ๋ฌธ์„ ์ฝ”๋“œ์—์„œ ์ฐพ์•„๋‚ด์–ด ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ , ์ฝ”๋“œ์˜ ํ‰๊ฐ€ ๊ณผ์ •์ด ๋๋‚˜๋ฉด ๋ชจ๋“  ์„ ์–ธ๋ฌธ์„ ์ œ์™ธํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์„ ์–ธ๋ฌธ์ด ์ฝ”๋“œ ์–ด๋””์— ์žˆ๋“  ์ƒ๊ด€ ์—†์ด ๋‹ค๋ฅธ ์ฝ”๋“œ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ๋ฌธ์ด ์–ด๋””์— ์œ„์น˜ํ•˜๋Š”์ง€์™€ ์ƒ๊ด€์—†์ด ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…(Variable hoisting)

๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์ฝ”๋“œ์˜ ์„ ๋‘๋กœ ๋Œ์–ด ์˜ฌ๋ ค์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ ํ•œ๋‹ค.

๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๋Š” 3๋‹จ๊ณ„

  1. ์„ ์–ธ ๋‹จ๊ณ„(Declaration phase)

    ๋ณ€์ˆ˜๋ฅผ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€์ˆ˜ ๊ฐ์ฒด(Variable object)์— ๋“ฑ๋กํ•œ๋‹ค. ์ด ๋ณ€์ˆ˜ ๊ฐ์ฒด๋Š” scope๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ์ด ๋œ๋‹ค.

  2. ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„(Initialization phase)

    ๋ณ€์ˆ˜ ๊ฐ์ฒด(Variable object)์— ๋“ฑ๋ก๋œ ๋ณ€์ˆ˜๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋ฉ”๋ชจ๋ฆฌ์— ํ™•๋ณดํ•œ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ ๋ณ€์ˆ˜๋Š” undefined๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

  3. ํ• ๋‹น ๋‹จ๊ณ„(Assignmnet phase)

    undifined๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ณ€์ˆ˜์— ์‹ค์ œ ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ๋ณ€์ˆ˜์— ์ฐธ์กฐํ•˜์—ฌ๋„ ๋ณ€์ˆ˜ ๊ฐ์ฒด(variable object)์— ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ReferenceError๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

let, const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜

let, const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” '์„ ์–ธ ๋‹จ๊ณ„'์™€ '์ดˆ๊ธฐํ™” ๋‹จ๊ณ„'๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.

์ฝ”๋“œ๊ฐ€ ํ‰๊ฐ€๋˜๋Š” ๊ณผ์ •์—์„œ ์‹๋ณ„์ž๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์„ ์–ธ ๋‹จ๊ณ„๋Š” ์‹คํ–‰๋˜์ง€๋งŒ, ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์‹คํ–‰๋œ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…(Function hoisting)

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์ฝ”๋“œ์˜ ์„ ๋‘๋กœ ๋Œ์–ด ์˜ฌ๋ ค์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณ ์œ ์˜ ํŠน์ง•์„ ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ ํ•œ๋‹ค.

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์œผ๋กœ ์ •์˜ํ•œ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์ด์ „ ์ฝ”๋“œ ํ‰๊ฐ€ ๊ณผ์ •์—์„œ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ „์—ญ ๊ฐ์ฒด์— ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์ƒ์„ฑ๋œ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

๊ฐ์ฒด ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ์— ๋ฐ”์ธ๋”ฉ๋œ BindingObject๋ฅผ ํ†ตํ•ด ์ „์—ญ ๊ฐ์ฒด์— ์‹๋ณ„์ž๋ฅผ ํ‚ค๋กœ ๋“ฑ๋กํ•œ๋‹ค.

๋Ÿฐํƒ€์ž„ ๋‹จ๊ณ„์—์„œ ์ด๋ฏธ ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์‹๋ณ„์ž์— ๋ฐ”์ธ๋”ฉ๊นŒ์ง€ ์™„๋ฃŒ๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ณ  ํ˜ธ์ถœ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ •์˜ํ•œ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์ด์ „์— ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•œ๋‹ค.

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ณ€์ˆ˜ ํ• ๋‹น๋ฌธ์˜ ๊ฐ’์€ ํ• ๋‹น๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์ธ ๋Ÿฐํƒ€์ž„์— ํ‰๊ฐ€๋˜๋ฏ€๋กœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๋„ ํ• ๋‹น๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ํ‰๊ฐ€๋˜๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์œผ๋กœ ์ •์˜ํ•œ ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ •์˜ํ•œ ํ•จ์ˆ˜ ๋‘˜๋‹ค ํ˜ธ์ด์ŠคํŒ…์€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ƒ์„ฑ ์‹œ์ ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹น์—ฐํ•œ ๊ทœ์น™์„ ๋ฌด์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ๋Œ€์‹  ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…๊ณผ ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ๋Ÿฐํƒ€์ž„ ์ด์ „ ์ฝ”๋“œ ํ‰๊ฐ€ ๋‹จ๊ณ„์—์„œ ๋จผ์ € ์‹คํ–‰๋˜๊ณ  ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑ, ๊ฐ์ฒด ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ์— ๋ฐ”์ธ๋”ฉ๋œ BindingObject๋ฅผ ํ†ตํ•ด ์ „์—ญ ๊ฐ์ฒด์— ์‹๋ณ„์ž๋ฅผ ํ‚ค๋กœ ๋“ฑ๋ก ํ•œ๋‹ค๋Š” ์ ์€ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ, var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” undefined๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ , ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์„ ํ†ตํ•ด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์‹๋ณ„์ž๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์— ์˜ํ•ด undefiend๋กœ ํ‰๊ฐ€๋œ๋‹ค.

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์œผ๋กœ ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์— ์˜ํ•ด ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

logo
Things I've Learned