[JavaScript] ํ˜ธ์ด์ŠคํŒ… Hoisting๊ณผ TDZ
728x90

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐœ๋…์„ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ํ•„์ˆ˜์ ์œผ๋กœ ๋งˆ์ฃผ์น˜๊ฒŒ ๋˜๋Š” ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•ด ๋”ฐ๋กœ ์ •๋ฆฌํ•ด ๋ณธ๋‹ค.

 

ํ˜ธ์ด์ŠคํŒ… Hoisting

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณ€์ˆ˜ ์„ ์–ธ์ด๋‚˜ ํ•จ์ˆ˜ ์„ ์–ธ์ด ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ ค์ง€๋Š” ํ˜„์ƒ์„ ๋งํ•œ๋‹ค.

 

๋ณ€์ˆ˜์˜ ํ˜ธ์ด์ŠคํŒ…

๋จผ์ € ๋ณ€์ˆ˜์—์„œ์˜ ํ˜ธ์ด์ŠคํŒ…์„ ์•Œ์•„๋ณด์ž.

var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜

console.log(hi); // undefined
var hi = 'hello';

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, undefined๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ํ˜ธ์ด์ŠคํŒ… ๋•Œ๋ฌธ์ธ๋ฐ, ๋ณ€์ˆ˜ hi์˜ ์„ ์–ธ๋ฌธ์ด ๋จผ์ € ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€ ๋ฒ„๋ ค ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ์•„์ง 'hello'๋ผ๋Š” ํ• ๋‹น์„ ๋ฐ›๊ธฐ ์ „์ธ ์ƒํƒœ์ด๋‹ค.

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ์„ ์–ธ๊ณผ ๋™์‹œ์— undefined๋กœ ํ• ๋‹น๋œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

 

 

let ๋˜๋Š” const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜

console.log(kiwi); // Uncaught ReferenceError: kiwi is not defined

let kiwi = 'kiwi'; // ์„ ์–ธ๊ณผ ํ• ๋‹น
console.log(kiwi); // kiwi

์ด๋ฒˆ์—” es6์— ์ถ”๊ฐ€๋œ let, const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ๋ณด์ž. let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์˜ˆ์‹œ๋กœ ๋„ฃ์—ˆ๋‹ค.
let, const ํ‚ค์›Œ๋“œ๋Š” var ํ‚ค์›Œ๋“œ์™€ ๋‹ฌ๋ฆฌ ๋ณ€์ˆ˜์˜ ์„ ์–ธ ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™”(ํ• ๋‹น) ๋‹จ๊ณ„๊ฐ€ ๋‚˜๋‰˜์–ด์„œ ์ง„ํ–‰๋œ๋‹ค.

 

์ฒซ ๋ฒˆ์งธ ์ถœ๋ ฅ์—์„œ ๋ณ€์ˆ˜๊ฐ€ ์•„์ง ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๋ณ€์ˆ˜ kiwi๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๊ธฐ ์ „๊นŒ์ง€, ์ฐธ์กฐ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด ๊ตฌ๊ฐ„์„ TDZ(Temporal Dead Zone). ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€๋ผ๊ณ  ํ•œ๋‹ค.
์ด ๊ตฌ๊ฐ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ ๋•๋ถ„์— ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ํ•จ์ˆ˜์˜ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜์˜ ํ˜ธ์ด์ŠคํŒ… ์—ญ์‹œ ๋ณ€์ˆ˜์˜ ํ˜ธ์ด์ŠคํŒ…๊ณผ ๋น„์Šทํ•˜๊ฒŒ ํ•จ์ˆ˜์„ ์–ธ์ด ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฎ๊ฒจ์ง€๋Š” ํ˜„์ƒ์ด๋‹ค.

 

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ

foo();

function foo(){
    console.log('hi');
}

์œ„ ์ฝ”๋“œ๋Š” ์ •์ƒ์ ์œผ๋กœ 'hi'๋ผ๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
ํ•จ์ˆ˜ foo()๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„์— ์„ ์–ธ๋˜๋Š” ํ๋ฆ„์ด์ง€๋งŒ, ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•ด์„œ ์ด๋ฏธ ์ตœ์ƒ๋‹จ์— foo()๊ฐ€ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

 

 

ํ•จ์ˆ˜ ํ‘œํ˜„์‹

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ๋Š” ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋Š” ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์˜ ํ˜ธ์ด์ŠคํŒ…์ฒ˜๋Ÿผ ์„ ์–ธ๊ณผ ํ• ๋‹น์ด ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.

banana(); // TypeError: banana is not a function

const banana = function(){
    console.log('b');
}

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ TypeError: banana is not a function ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ํ๋ฆ„์ด ํ• ๋‹น๋ฌธ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

TDZ(Temporal Dead Zone)

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ TDZ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ธฐ ์ „์— ์ฐธ์กฐํ•˜๋ ค ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ๋งํ•œ๋‹ค.
TDZ๋Š” let, const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์—์„œ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค.
์ด ํ‚ค์›Œ๋“œ๋“ค์€ ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๊ณ , TDZ ์—ญ์‹œ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ธ”๋ก ๋ฒ”์œ„ ์•ˆ์—์„œ๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

let, const ๋ณ€์ˆ˜ ์—ญ์‹œ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ TDZ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

 

 

์ถœ์ฒ˜

https://ko.javascript.info/function-expressions#ref-377

https://ko.javascript.info/var

728x90