๐ŸŽจFrontEnd/Javascript

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ

IOTrue 2023. 3. 28. 14:13

๐Ÿ˜Ž ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ

 

โœ… ํ˜ธ์ด์ŠคํŒ…

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

 

ํ˜ธ์ด์ŠคํŒ… ๊ทœ์น™

ํ˜ธ์ด์ŠคํŒ…์€ ํฌ๊ฒŒ ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…๊ณผ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์œผ๋กœ ๋‚˜๋‰œ๋‹ค. 

  1. ์„ ์–ธ๋œ ํ•จ์ˆ˜๋Š” ์ƒ๋‹จ์—์„œ ์ฐธ์กฐ, ํ˜ธ์ถœ ๊ฐ€๋Šฅ.
  2. ์„ ์–ธ๋œ var ๋Š” ์ƒ๋‹จ์—์„œ ์ฐธ์กฐ, ํ• ๋‹น ๊ฐ€๋Šฅ.
  3. ์„ ์–ธ๋œ let, const ๋Š” ์ƒ๋‹จ์—์„œ ์ฐธ์กฐ, ํ• ๋‹น ๋ถˆ๊ฐ€๋Šฅ.

 

[ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—์„œ ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹์˜ ์ฐจ์ด]

function declaration(){ //ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
	console.log('ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ')
}
declaration()


const expression = function(){ //ํ•จ์ˆ˜ ํ‘œํ˜„์‹
    console.log('ํ•จ์ˆ˜ ํ‘œํ˜„์‹')
}
expression()

 

 

  -ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ : ํ•จ์ˆ˜ ์ „์ฒด๋ฅผ ํ˜ธ์ด์ŠคํŒ…

  -ํ•จ์ˆ˜ ํ‘œํ˜„์‹ : ๋ณ€์ˆ˜์˜ ์„ ์–ธ๋ถ€ & ํ• ๋‹น๋ถ€๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ํ˜ธ์ด์ŠคํŒ… > ์„ ์–ธ๋ถ€ ๋จผ์ € ํ˜ธ์ด์ŠคํŒ…

declaration() // 'ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ'
expression() // ReferenceError: Cannot access 'expression' before initialization

function declaration(){
	console.log('ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ')
}

const expression = function(){
    console.log('ํ•จ์ˆ˜ ํ‘œํ˜„์‹')
}


// ์œ„์˜ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค

function declaration(){ // ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ : ์ „์ฒด ํ˜ธ์ด์ŠคํŒ…
	console.log('ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ')
}
const expression // ํ•จ์ˆ˜ ํ‘œํ˜„์‹ : ๋ณ€์ˆ˜๋งŒ ์„ ์–ธ

declaration() // ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์‹คํ–‰ :'ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ'
expression() // ReferenceError: Cannot access 'expression' before initialization

function(){ // ํ•จ์ˆ˜ ํ‘œํ˜„์‹ : ํ• ๋‹น๋ถ€๋Š” ๊ทธ๋Œ€๋กœ
    console.log('ํ•จ์ˆ˜ ํ‘œํ˜„์‹')
}


// ์ •์ƒ ์ž‘๋™ํ•˜๋ ค๋ฉด
const expression = function(){
    console.log('ํ•จ์ˆ˜ ํ‘œํ˜„์‹')
}
declaration() // 'ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ'
expression() // 'ํ•จ์ˆ˜ ํ‘œํ˜„์‹'
function declaration(){
	console.log('ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ')
}

 

[let, const, var, function์˜ ์‹คํ–‰ ์›๋ฆฌ]

*let, const, var

  -var๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ / let, const๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

  -var์€ ํ˜ธ์ด์ŠคํŒ… ๊ฐ€๋Šฅ/ let, const๋Š” ํ˜ธ์ด์ŠคํŒ… ์—๋Ÿฌ ๋ฐœ์ƒ (TDZ ์กด์žฌ)

  -var๋Š” ์ด๋ฏธ ์„ ์–ธ๋œ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณต ์„ ์–ธํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์ง€๋งŒ

     let, const๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณต ์„ ์–ธํ•˜๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ
  -var, let์€ ๋ณ€์ˆ˜ ์„ ์–ธ์‹œ ์ดˆ๊ธฐ ๊ฐ’์„ ์ฃผ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ const๋Š” ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐ๊ฐ’์„ ํ• ๋‹นํ•ด์•ผ ํ•จ

  -var, let์€ ์„ ์–ธ ํ›„ ๊ฐ’ ๋ณ€๊ฒฝ(์žฌํ• ๋‹น) ๊ฐ€๋Šฅ / const๋Š” ์„ ์–ธ๋œ ๊ฐ’ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ (๊ฐ์ฒด์•ˆ์˜ ํ”„๋กœํผํ‹ฐ ๋ณ€๊ฒฝ๊นŒ์ง€ ์ œํ•œ์€ ์•„๋‹˜)

 

*function

   *ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์€ ๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค ๊ฐ€์žฅ ๋จผ์ € ์ด๋ฃจ์–ด์ง€๊ณ , ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์€ ์„ ์–ธ๋ฌธ๋งŒ ํ•ด๋‹น๋œ๋‹ค.

  -ํ•จ์ˆ˜ ์ž‘์„ฑ > ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์ด ํ•จ์ˆ˜์˜ ์ด๋ฆ„ (ex-function name(){})์„ ์‹๋ณ„์ž๋กœ ์ €์žฅ > ํ•จ์ˆ˜ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ์ฐธ์กฐ

> ํ•จ์ˆ˜ ์‹คํ–‰ ๊ตฌ๋ฌธ์—์„œ name์„ ๋งŒ๋‚˜๋ฉด ๊ฐ’์„ ๊ฐ€์ ธ์˜ด > ๊ทธ ๋‹ค์Œ ๊ตฌ๋ฌธ์ด () ์ด๋ผ๋ฉด ์‹คํ–‰

> ๋งŒ์•ฝ ์Šค์ฝ”ํ”„์—์„œ ์‹๋ณ„์ž๋ฅผ ๋ชป ์ฐพ์•˜๋‹ค๋ฉด, ์ฐธ์กฐ ์—๋Ÿฌ(ReferenceError) ์ถœ๋ ฅ

> ์‹๋ณ„์ž๋Š” ์ฐพ์•˜์ง€๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ํƒ€์ž…์ด๋ผ๋ฉด ํƒ€์ž… ์—๋Ÿฌ(TypeError) ์ถœ๋ ฅ

not() // ReferenceError: not is not defined
let name = 'kim'
name() // TypeError: name is not a function

 

 

โœ… TDZ

TDZ (Temporal Dead Zone) - ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€
์Šค์ฝ”ํ”„ ์‹œ์ž‘ ~ ์ดˆ๊ธฐํ™” ์‹œ์ž‘ ์‚ฌ์ด์˜ ๊ตฌ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค.

 

์ฆ‰, ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ณ  ์ดˆ๊ธฐํ™” ์ „๊นŒ์ง€์˜ ๊ตฌ๊ฐ„์ด๋‹ค.

TDZ๋Š” ์„ ์–ธ ์ „ ๋˜๋Š” ์ดˆ๊ธฐํ™” ์ „์ธ ์ƒํƒœ์˜ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—

TDZ ๊ตฌ๊ฐ„์— ์„ ์–ธ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ดˆ๊ธฐํ™” ์ „์ธ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๋ณ€์ˆ˜ ์ƒ์„ฑ ๋‹จ๊ณ„

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

๋ณ€์ˆ˜๋ฅผ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€์ˆ˜ ๊ฐ์ฒด์— ๋“ฑ๋กํ•˜๋Š” ๋‹จ๊ณ„ (var๋Š” ์—ฌ๊ธฐ์„œ 2๋ฒˆ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊นŒ์ง€ ๋™์‹œ์— ์ง„ํ–‰)

let variable  /  var variable = undefined

 

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

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋กํ•œ ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„
๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉด ์ฒ˜์Œ์—๋Š” undefined๊ฐ€ ํ• ๋‹น๋œ๋‹ค.

variable = undefined

 

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

์‚ฌ์šฉ์ž๊ฐ€ undefined๋กœ ํ• ๋‹น๋œ ๋ณ€์ˆ˜์— ๋‹ค๋ฅธ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋‹จ๊ณ„

variable = "value"

 

let, const ์ƒ์„ฑ ๋‹จ๊ณ„
var ์ƒ์„ฑ ๋‹จ๊ณ„
ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์ƒ์„ฑ ๋‹จ๊ณ„

 

  • var๋Š” ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ๋™์‹œ์— ์ง„ํ–‰๋œ๋‹ค.
    ์‹คํ–‰ ์‹œ์  ์Šค์ฝ”ํ”„ ์ตœ์ƒ๋‹จ์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
    ์„ ์–ธ๋ถ€ ์œ„์น˜์— ์ƒ๊ด€ ์—†์ด ์ฐธ์กฐ, ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • let, const๋Š” ์„ ์–ธ, ์ดˆ๊ธฐํ™”, ํ• ๋‹น ๋‹จ๊ณ„๊ฐ€ ๊ฐ๊ฐ ๋”ฐ๋กœ ์ง„ํ–‰๋œ๋‹ค.
    ํ˜ธ์ด์ŠคํŒ… ์‹œ, ์„ ์–ธ๋งŒ ์ด๋ฃจ์–ด์ง€๊ณ  ์‹คํ–‰ ์‹œ์ ์—์„œ ์‹ค์ œ ์„ ์–ธ๋ถ€๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.
    ์ด ์‹œ์  ์ฐจ์ด๋งŒํผ ํ•ด๋‹น ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—
    ์„ ์–ธ๋ถ€ ์ƒ๋‹จ์—์„œ ์ฐธ์กฐ, ํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • function (ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ)์€ ์„ ์–ธ, ์ดˆ๊ธฐํ™”, ํ• ๋‹น ๋‹จ๊ณ„๊ฐ€ ๋™์‹œ์— ์ง„ํ–‰๋œ๋‹ค.
    ์„ ์–ธ๋ถ€ ์œ„์น˜์— ์ƒ๊ด€ ์—†์ด ์ฐธ์กฐ, ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

โ— ์ •๋ฆฌ

  • let, const, class ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” TDZ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
  • var, function(์„ ์–ธ๋ฌธ), import๋Š” TDZ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
  • ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด var ๋Œ€์‹  let ๋˜๋Š” const๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 

 

 

์ฐธ๊ณ 

https://developer.mozilla.org/ko/docs/Glossary/Hoisting

 

ํ˜ธ์ด์ŠคํŒ… - MDN Web Docs ์šฉ์–ด ์‚ฌ์ „: ์›น ์šฉ์–ด ์ •์˜ | MDN

JavaScript์—์„œ ํ˜ธ์ด์ŠคํŒ…(hoisting)์ด๋ž€, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ ์–ธ ์ „์— ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜ธ์ด์ŠคํŒ… ์‹œ undefined๋กœ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค

developer.mozilla.org