๐Ÿ”ฅ๐Ÿ•บ๐Ÿผ ์‹œ์ž‘์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ํ˜ธ์ด์ŠคํŒ…

๐Ÿ‘Š0๐Ÿ‘Šยท2020๋…„ 1์›” 28์ผ
0

(https://dev.to/lydiahallie/javascript-visualized-hoisting-478h) ์„ ๋ฒˆ์—ญํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

ํ˜ธ์ด์ŠคํŒ…์€ ๋ชจ๋“  JS ๊ฐœ๋ฐœ์ž๊ฐ€ ์งœ์ฆ๋‚˜๋Š” ์—๋Ÿฌ๋ฅผ ๊ตฌ๊ธ€๋งํ•˜๊ณ  ๊ฒฐ๊ตญ ์Šคํƒ์˜ค๋ฒ„ ํ”Œ๋กœ์šฐ์—์„œ ๋“ค์–ด๋ณธ ์šฉ์–ด ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๊ฑฐ๊ธฐ์„œ ์‚ฌ๋žŒ๋“ค์€ '์ด ์—๋Ÿฌ๋“ค์€ ํ˜ธ์ด์ŠคํŒ…(hosisting) ๋•Œ๋ฌธ์ด์•ผ'๋ผ๊ณ  ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ๐Ÿ™ƒ ๊ทธ๋ž˜์„œ ๋„๋Œ€์ฒด ํ˜ธ์ด์ŠคํŒ…์ด ๋ญ˜๊นŒ? (์ฐธ๊ณ ๋กœ - ์Šค์ฝ”ํ”„๋Š” ๋‹ค๋ฅธ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ฃฌ๋‹ค, ๋‚œ ํฌ์ŠคํŠธ๋Š” ์ž‘๊ณ  ์ง‘์ค‘์ ์ด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค.)

๋„ˆ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝ๊ฐ€ ์ฒ˜์Œ์ด๋ผ๋ฉด, ์•„๋งˆ "์ด์ƒํ•œ" ๋™์ž‘๋“ค์„ ๊ฒฝํ—˜ํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ๋ช‡๋ช‡ ๋ณ€์ˆ˜๋“ค์ด ๋ฌด์ž‘์œ„์ ์œผ๋กœ undefined๋˜๊ณ  ReferenceErrors๋ฅผ ๋ฑ‰๋Š” ๋“ฑ์˜ ๊ฒฝํ—˜๋ง์ด๋‹ค. ํ˜ธ์ด์ŠคํŒ…์€ ํŒŒ์ผ ์ƒ๋‹จ์— ๋ณ€์ˆ˜๋“ค๊ณผ ํ•จ์ˆ˜๋“ค์ด ์‚ฝ์ž…๋œ๋‹ค๊ณ  ์„ค๋ช…๋˜์ง€๋งŒ, ์•„๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ์ผ์€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๋™์ž‘๋“ค์ด ๋งˆ์น˜ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์–ด๋„ ๋ง์ด๋‹ค. ๐Ÿ˜ƒ

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

1|| ํ•จ์ˆ˜์—๋Š” ์ „์ฒด ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.
1.gif

๋ณ€์ˆ˜์—์„  ์‚ด์ง ๋‹ค๋ฅด๋‹ค. ES6๋Š” ๋‘ ๊ฐ€์ง€ ๋ณ€์ˆ˜ ์„ ์–ธ ํ‚ค์›Œ๋“œ์ธ let๊ณผ const๋ฅผ ์†Œ๊ฐœํ–ˆ๋‹ค. let๊ณผ const๋กœ ๋ณ€์ˆ˜์„ ์–ธ์„ ํ•˜๋ฉด ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.

2 || let๊ณผ const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋“ค์€ uninitialized๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.(ES6์˜ class๋“ค ํฌํ•จํ•จ)
2.gif

var ํ‚ค์›Œ๋“œ๋กœ ๋ณ€์ˆ˜์„ ์–ธ์„ ํ•˜๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ’(value)์ด undefined๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด ์ €์žฅ๋œ๋‹ค.

3 || var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋“ค์€ undefined๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.
3.gif

์ง€๊ธˆ ์ƒ์„ฑ๋‹จ๊ณ„(creation phase)๊ฐ€ ๋๋‚ฌ๋‹ค, ์ด์ œ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํŒŒ์ผ ์ƒ๋‹จ์— 3๊ฐœ์˜ console.log๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณด์ž. ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋“ค์€ ๋ชจ๋‘ ์„ ์–ธ๋˜๊ธฐ ์ „์ด๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ์ „์ฒด ํ•จ์ˆ˜ ์ฝ”๋“œ์˜ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ค„ ์ด์ „์—๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ”ฅ

4 || execution phased๋™์•ˆ์—๋Š”, ํ•จ์ˆ˜๋“ค์„ ์„ ์–ธํ•˜๊ธฐ ์ „์—, ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์— ์ „์ฒด ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
4.gif

๋ณ€์ˆ˜๋“ค์ด ์„ ์–ธ๋˜๊ธฐ ์ „์— var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ๋•Œ, ๋‹จ์ˆœํ•˜๊ฒŒ๋„ ์ €์žฅ๋œ undefined!์ธ ๊ธฐ๋ณธ๊ฐ’์„ ๋ฐ˜ํ•œํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ, ๋•Œ๋•Œ๋กœ "์˜ˆ๊ธฐ์น˜๋ชปํ•œ" ๋™์ž‘์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ๊ฒฝ์šฐ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. (์•„๋งˆ undefined์˜ ๊ฐ’์„ ๊ฐ–๋„๋ก ์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.) ๐Ÿ˜ฌ

5 || ์„ ์–ธ๋˜๊ธฐ ์ „์— varํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋“ค์„ ์ฐธ์กฐํ•  ๋•Œ, ๊ฐ’๋“ค์€ ๊ธฐ๋ณธ undefined๋กœ ๋  ๊ฒƒ์ด๋‹ค.
5.gif

var ํ‚ค์›Œ๋“œ ๊ฐ™์€ undefined์ธ ๊ฐ’์„ ์šฐํ˜„ํžˆ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ง‰๊ธฐ์œ„ํ•ด, ์šฐ๋ฆฌ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋“ค์„ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ ReferenceError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ ์‹ค์ œ๋กœ ์„ ์–ธ๋˜๊ธฐ ์ „์˜ "์ง€์ (zone)"์„ temporal dead zone๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. TDZ(temporal daed zone)๋Š” ๋ณ€์ˆ˜๋“ค์˜ ์ดˆ๊ธฐํ™”์ „์— ์ฐธ์กฐํ•  ์ˆ˜ ์—†๊ฒŒํ•œ๋‹ค.

6 || ์ผ๋‹จ ์šฐ๋ฆฌ๊ฐ€ ๋ณ€์ˆ˜๋“ค์„ ์„ ์–ธํ•œ ์ค„์„ ๋„˜์–ด๊ฐ€๊ธฐ๋งŒ ํ•˜๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์—์„œ ๋ณ€์ˆ˜๋“ค์€ ๋‹ค์‹œ ์จ์ง„๋‹ค.
6.gif

์—”์ง„์ด ์‹ค์ œ๋กœ ๋ณ€์ˆ˜๋“ค์ด ์„ ์–ธ๋œ ๋ผ์ธ์„ ๋„˜์–ด๊ฐ€๋ฉด, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณ€์ˆ˜๋“ค์€ ์‹ค์ œ๋กœ ์„ ์–ธ๋œ ๊ฐ’๋“ค๋กœ ๋ฎ์–ด์”Œ์›Œ์ง„๋‹ค.

(์›์Šค, ์ด์ œ 7์ด ๋˜๋ ค๊ณ  ํ•œ๋‹ค. ๋นจ๋ฆฌ ๋๋‚ด์•ผ๊ฒ ๋‹ค.!!๐Ÿ˜ฌ)
gif12.gif

๋ชจ๋‘ ๋๋‚ฌ๋‹ค ! ๐ŸŽ‰ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด์ž.

  • ํ•จ์ˆ˜๋“ค๊ณผ ๋ณ€์ˆ˜๋“ค์€ ์‹คํ–‰ ์ปจํ…์Šค๋ฅผ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋‹ค์Œ์—, ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๋“ค์€ ์‹คํ–‰๋œ๋‹ค. ์ด๊ฒƒ์„ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ํ•จ์ˆ˜๋“ค์€ ์ „์ฒด ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐ๋˜์–ด ์ €์žฅ๋œ๋‹ค, var ํ‚ค์›Œ๋“œ๋กœ ์‚ฌ์šฉ๋œ ๋ณ€์ˆ˜๋“ค์€ undefined๊ฐ’๋“ค์„ ๊ฐ€์ง€๊ณ , let๊ณผ const๋ฅผ ๊ฐ€์ง„ ๋ณ€์ˆ˜๋“ค์€ ์ดˆ๊ธฐํ™”๋˜์ง€์•Š์€(uninitialized)์ฑ„๋กœ ์ €์žฅ๋œ๋‹ค.

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

profile
ใ…Žใ…Ž

0๊ฐœ์˜ ๋Œ“๊ธ€