์๋ฐ์คํฌ๋ฆฝํธ ํธ์ด์คํ ๊ณผ TDZ
๐ ์๋ฐ์คํฌ๋ฆฝํธ ํธ์ด์คํ ๊ณผ TDZ
โ ํธ์ด์คํ
ํธ์ด์คํ (Hoisting)
์ฝ๋ ์คํ ์ ๋ณ์์ ํจ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฏธ๋ฆฌ ํ ๋นํ๋ ๊ฒ.
์ฝ๋์์ ์ ์ธ๋ ์์น์ ์๊ด์์ด ๋ณ์ ๋ฐ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์๋ฏธ์ด๋ค.
์ฆ, ๋ณ์ ๋ฐ ํจ์ ์ ์ธ์ด ์ค์ฝํ์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ง๋ ๊ฒ ๊ฐ์ ํ์์ ์๋ฏธํ๋ค.
ํธ์ด์คํ ๊ท์น
ํธ์ด์คํ ์ ํฌ๊ฒ ํจ์ ํธ์ด์คํ ๊ณผ ๋ณ์ ํธ์ด์คํ ์ผ๋ก ๋๋๋ค.
- ์ ์ธ๋ ํจ์๋ ์๋จ์์ ์ฐธ์กฐ, ํธ์ถ ๊ฐ๋ฅ.
- ์ ์ธ๋ var ๋ ์๋จ์์ ์ฐธ์กฐ, ํ ๋น ๊ฐ๋ฅ.
- ์ ์ธ๋ 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"
- 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