๐Ÿ’ป๐Ÿ’€/๊ฐœ๋ฐœ

[JS] ํ˜ธ์ด์ŠคํŒ…(Hoisting)

db2 2022. 8. 28. 10:14

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

์ฝ”๋“œ ์‹คํ–‰ ์ „์— ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ์„ ์–ธ๋ฌธ์ด ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ๊ฐ€์žฅ ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ธฐ๋„ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์ง€๋งŒ, ์ด๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค.

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

์›๋ฆฌ

๋จผ์ € ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋ณด๋ฉฐ ํ˜ธ์ด์ŠคํŒ…์ด ๋˜๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•ด๋ณด์ž.

console.log(amIHoisted); // undefined
var amIHoisted = true;
console.log(amIHoisted); // true

๋…ผ๋ฆฌ์ ์œผ๋กœ ์ƒ๊ฐํ–ˆ์„ ๋•Œ ์ฒซ๋ฒˆ์งธ ์ค„์—์„œ ์—๋Ÿฌ๋ฅผ ๋ฟœ์–ด๋‚ด์•ผํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‘๋ฒˆ์งธ ์ค„์˜ amIHoisted ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์ด ๊ฐ€์žฅ ์œ„๋กœ ํ˜ธ์ด์ŠคํŒ… ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ• ๋‹น๋œ ์ดˆ๊ธฐ๊ฐ’์ด ์—†์„ ์‹œ ๊ธฐ๋ณธ๊ฐ’ undefined๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธด ์ปค๋…• undefined ๊ฐ’์„ ์–ป๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์•„๋ž˜๋Š” ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „, ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ•ด์„๋˜๋Š” ๊ณผ์ •์ด๋‹ค.

var amIHoisted; // ์„ ์–ธ + undefined๋กœ ์ดˆ๊ธฐํ™”
console.log(amIHoisted); // undefined

amIHoisted = true; // ์‹ค์ œ ๊ฐ’ ์ดˆ๊ธฐํ™”
console.log(amIHoisted); // true

๋ฐ˜๋ฉด์— ์„ ์–ธ๋ฌธ์ด ์—†๋‹ค๋ฉด ๋ณ€์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ… ๋˜์ง€ ์•Š๋Š”๋‹ค.

console.log(amIHoisted); // Uncaught ReferenceError: amIHoisted is not defined
amIHoisted = false;

ํ•˜์ง€๋งŒ ์ดˆ๊ธฐํ™”๋Š” ์ž๋™์ ์œผ๋กœ ์„ ์–ธ์„ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ดˆ๊ธฐํ™”๋ฌธ์ด ๋จผ์ € ์˜จ๋‹ค๋ฉด, ์ •์ƒ์ ์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

amIHoisted = false;
console.log(amIHoisted); // false

let, const ์˜ ํ˜ธ์ด์ŠคํŒ…

let, const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋„ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•œ๋‹ค. ํ•˜์ง€๋งŒ var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์™€๋Š” ๋‹ฌ๋ฆฌ undefined๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ReferenceErrorr๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

console.log(iAmHoisted); // Uncaught ReferenceError: Cannot access 'iAmHoisted' before initialization
const amIHoisted = true;

์˜ˆ์ œ

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

var number = 1;
function hoistingTest() {
    // var number; // ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•œ๋‹ค.
    console.log(number);
    var number = 2;
}

hoistingTest(); // undefined

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

์„ ์–ธ์‹์œผ๋กœ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ…๊ณผ ๋™์‹œ์— ๊ฐ’์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. var ๋ณ€์ˆ˜์ฒ˜๋Ÿผ undefined๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์‹ค์ œ ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์—๋„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋™์ž‘์‹œํ‚ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

hoistingTest(); // It Works!

function hoistingTest() {
    console.log('It Works!');
}

์•„๋ž˜์ฒ˜๋Ÿผ ํ‘œํ˜„์‹์œผ๋กœ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•œ๋‹ค.

hoistingTest(); // Uncaught ReferenceError: hoistingTest is not defined

const hoistingTest = () => {
    console.log('It Works!');
}

์ฐธ๊ณ 
https://developer.mozilla.org/en-US/docs/Glossary/Hoisting
https://www.educative.io/courses/javascript-interview-handbook/YMBzwk2zxBA