JavaScript Visualized: ๐Ÿ”ฅ๐Ÿ•บ๐Ÿผ Hoisting

Posted on September 01, 2020ย  - ย 3 min read

reference: 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๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ดค๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ œ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ์ข€ ๋” ์ดํ•ดํ•˜์…จ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์–ธ์ œ๋‚˜ ๊ทธ๋ ‡๋“ฏ ์™„์ „ํžˆ ๋Š๋‚Œ์ด ์˜ค์ง€ ์•Š๋”๋ผ๋„ ๊ฑฑ์ •๋งˆ์„ธ์š”. ์‹ค์ œ๋กœ ํ•ด๋ณผ์ˆ˜๋ก ๋” ์ต์ˆ™ํ•ด์ง€์‹ค ๊ฒ๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•œ ์  ์žˆ์œผ์‹œ๋ฉด ์–ธ์ œ๋“  ์—ฐ๋ฝ์ฃผ์„ธ์š”. ๐Ÿ˜ƒ