ํธ์ด์คํ (Hoisting)
ํธ์ด์คํ ์ ๋ณ์๋ ํจ์ ์ ์ธ์ ํจ์ ์ ํจ ๋ฒ์(๋๋ ํจ์ ์ธ๋ถ์ ๊ฒฝ์ฐ ์ ์ญ ๋ฒ์)๊ฐ JS ์์ง์์ํด
๋งจ ์๋ก ์ด๋ํ๋ ํ์์ ๋งํ๋ค.
( ๐ธ : ์ด๋ ๊ฒ ๋งํ๋ฉด ์ฌ์ด ๋ฌธ์ฅ ๊ฐ์ผ๋ฉด์๋ ์ด๋ ค์ด๊ฑฐ ์์์ ์ ๋ ๊ทธ๋ฌ์ผ๋๊น ์ฒ์ฒํ ์ฝ์ผ๋ฉด์ ๋ด๋ ค๊ฐ๋ณด๋ฉด ์กฐ๊ธ์ฉ ์ดํด๋ ๊ฒ๋๋ค..! )
JavaScript ์์ง์ ์คํํ๊ธฐ ์ ์ ์ฝ๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ๊ตฌ๋ฌธ ๋ถ์ ๋จ๊ณ ์ค์ ๋ชจ๋
๋ณ์ ๋ฐ ํจ์ ์ ์ธ ์ ๋ฒ์์ ๋งจ ์๋ก ์ด๋ํฉ๋๋ค.
JS ์์ง์ ์ด๋ฌํ ๋์์ ํธ์ด์คํ ( hoisting)์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋ฅผ ์ ๋๋ก ์ดํดํ๊ธฐ ์ํด์๋ TDZ์ ๋ณ์์ ์์ฑ ๋จ๊ณ์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค.
TDZ
TDZ(Temporal Dead Zone) ์ง์ญ์ ์ผ์์ ์ธ ์ฌ๊ฐ์ง๋๋ ๋ป์ด๋ค.
์ด ์ผ์์ ์ธ ์ฌ๊ฐ์ง๋๋ ์ค์ฝํ์ ์์ ์ง์ ๋ถํฐ ์ด๊ธฐํ ์์ ์ง์ ๊น์ง์ ๊ตฌ๊ฐ์ด๋ค.
TDZ๋ผ๋ ๊ฒ์ ๋ณ์ ์ ์ธ ๋ฐ ์ด๊ธฐํ ํ๊ธฐ ์ ์ฌ์ด์ ์ฌ๊ฐ์ง๋ ์ธ ๊ฒ์ ์ ์ ์๋ค!
์ฆ ๋ณ์๋ฅผ ์ ์ธ ๋ฐ ์ด๊ธฐํ ํ๊ธฐ์ ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด TDZ ์ํ์์ ์ฌ์ฉํ๋ ๊ฒ ์ด๊ธฐ ๋๋ฌธ์ ReferenceError ์๋ฌ๊ฐ ๋ํ๋๊ฒ ๋๋ ๊ฒ์ด๋ค !!
๋ณ์์ ์์ฑ ๋จ๊ณ
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ณ์(variable)๋ 3๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑธ์ณ ์์ฑ๋๋ค.
Step 1. Declaration phase : ์ ์ธ ๋จ๊ณ
- ๋ณ์๋ฅผ ์คํ ์ปจํ ์คํธ์ ๋ณ์ ๊ฐ์ฒด์ ๋ฑ๋กํ๋ ๋จ๊ณ์ด๋ค.
- ์ด ๋ณ์ ๊ฐ์ฒด๋ ์ค์ฝํ๊ฐ ์ฐธ๊ณ ํ๋ ๋์์ด ๋๋ค.
- ๋ณ์๋ฅผ ์ ์ธํ๋ค. ์) var myValue
Step 2. Initialization phase : ์ด๊ธฐํ ๋จ๊ณ
- ์คํ ์ปจํ ์คํธ์ ์กด์ฌํ๋ ๋ณ์ ๊ฐ์ฒด์ ์ ์ธ ๋จ๊ณ์์ ์์ฑ๋ ๋ณ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง๋๋ ๋จ๊ณ์ด๋ค.
- ์ด ๋จ๊ณ์์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ์๋์ผ๋ก undefined ๋ก ์ด๊ธฐํ ๋๋ค.
Step 3. Assignment phase : ํ ๋น ๋จ๊ณ
- ์ด๊ธฐํ ๋จ๊ณ์์ undefined๋ก ์ด๊ธฐํ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ๊ฐ์ ํ ๋นํ๋ ๋จ๊ณ์ด๋ค.
- myValue = 100
// ์ ์ธ
var setId;
// ์ด๊ธฐํ(ํ ๋น)
serId = '16';
// ์ฌ์ฉ
alert(myValue);
๋ณ์์ ๊ดํ ๋ฐฐ๊ฒฝ์ง์
- Block scope(๋ธ๋ก์ค์ฝํ)
{ }๋ก ๊ฐ์ธ์ ธ ์๋ ๋ธ๋ก ๋ฒ์๋ฅผ ๋งํ๋ค. ( if,for, ํจ์, while, try/catch ๋ฑ...)
{ } ๋ธ๋ก ์ค์ฝํ ์์ ์๋ ์๋ค์ ๋์ด์ ๋ฐ์ค ๋ฐ์์ ๋ณผ ์ ์๋ค( ์ฌ์ฉํ ์ ์๋ค, ๋ธ๋ก์์์๋ง ๊ฐ๋ฅ )
// ์ ์ญ ๋ณ์
let globalName = 'global scope'
{
let name = "Frog";
console.log(name);
name = "Hello";
console.log(name);
// ์ ์ญ ๋ณ์๋ ๋ธ๋ก ๋ฐ์์ ํธ์ถ์ ๋ฌผ๋ก ์ด๊ณ ์์์๋ ํธ์ถํ ์์๋ค.
console.log(globalName);
}
console.log(name); // ๋ธ๋ก ์์์๋ name ๋ณ์์๋ ์ ๊ทผํ ์ ์๋ค. Error
console.log(globalName)
๋ณ์ ํธ์ด์คํ (Variable Hoisting)
๋ณ์ ํธ์ด์คํ ์์๋ Var ๋ณ์์ ๋ํด์๋ง Error๊ฐ ๋จ์ง์์ผ๋ฉฐ, undefined๋ก ์๋ ์ด๊ธฐํ ๋๊ฒ์ ์ ์ ์๋ค.
๋ค๋ฅธ ๋ณ์๋ค( const, let )์ ๋ํด์๋ ์๋์์ ๋ค๋ค๋ณธ๋ค.
console.log(num); // undefined
var num = "oneTwoThree";
num ๋ณ์์ ๊ฐ์ ์ ์๋์ง ์์์ง๋ง ์ ์ธ๋๊ธฐ ์ ์ ๋ณ์์ ์ ๊ทผํ ์ ์์์ ์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ค์ ๋ก ๋ณด์ด์ง ์์ง๋ง JS ์์ง์ด ์คํ ์ ์ ์ฝ๋๋ฅผ ์๋๐๐ป์ ๊ฐ์ด ์์ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค.
var num; // ํธ์ด์คํ
console.log(num); // undefined
num = "oneTwoThree";
var์ ๊ฒฝ์ฐ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์ด๊ธฐํํ๋ ๊ณผ์ ์ด ์๋์ ์ผ๋ก ๋์์ ์ผ์ด๋์ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ค.
๋ง์ง๋ง ์ค์์, num ์ ๊ฐ์ด ํ ๋น๋ฉ๋๋ค.
๐ซ์ฃผ์
๋ณ์ ์ ์ธ์ ์ ์ธ๋ ๋ฒ์์ ๋งจ ์๋ก ์ด๋๋๋ค๋ ์ ์ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ธ๋ก ๋ฒ์ ํจ์ ์์์ ๋ฐ๋ก ์ํฅ
function () {
console.log(x);
var x = 'ํจ์{}์ค์ฝํ ์์์ ํธ์ด์คํ
';
}
console.log(y);
var y = '๊ธ๋ก๋ฒ ๋ฒ์ ํธ์ด์คํ
';
โํ๋ฌ์ค
{
age = 4;
var age;
}
console.log(age); // block scope์ ๋ฌด์ํ๊ณ ์ฝ์์ฐํ var ๊นกํจ;;;
ํจ์ ํธ์ด์คํ (Function Hoisting)
JavaScript์ ํ์ ํจ์ ์ ์ธ๋ ๋ณ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฒ์์ ๋งจ ์๋ก ํธ์ด์คํธ๋ฉ๋๋ค.
class ๊ตฌ๋ฌธ์ ํธ์ด์คํธ๋์ง๋ง ์ํฅ์ ๋ฐ์ง ์๋๋ค.
Hello(); // Hello
function Hello() {
console.log("Hello");
}
์์ ์ฝ๋์์ ๋ณผ ์ ์๋ฏ ํจ์๋ ์ ์ธ๋ ์ ์ Hello() ์ฌ์ฉํ์ง๋ง ํธ์ด์คํ ์ผ๋ก ์ธํด Hello ๊ฐ์ด
์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์์๋ ๊ฒ์ด๋ค. ( ํธ์ด์คํ )
๋ณ์ ํธ์ด์คํ ๊ณผ ํจ์ ํธ์ด์คํ ์ ์ค์ํ ์ฐจ์ด์ ์
๋ณ์๊ฐ ํธ์ด์คํธ๋ var๋ค์ undefined์ผ๋ก ์๋ ์ด๊ธฐํ๋๋ ๋ฐ๋ฉด
ํจ์ ์ ์ธ์ ํธ์ด์คํธ ๋์ด ํด๋น ํจ์ ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋ค๋ ๊ฒ ์ ๋๋ค.
๐ซ์ฃผ์
ํจ์ ํธ์ด์คํ ์ ์๋์ ๊ฐ์ด ํจ์ ํํ์ ํ ๋น์๋ ์ ์ฉ๋์ง ์๋์ ์ฃผ์ํ์
Hello(); // TypeError: greeting is not a function
console.log(hello); // undefined
var hello = function Hello() {
console.log("Hello!");
};
Var, function ํธ์ด์คํ ์ด์ธ
์์ ๊ธ๋ก ์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง var, function์ ์ธ ์ ๋ํด์ ํธ์ด์คํ ๋๋ ๊ฒ์ ์์๋ค.
์ฐ๋ฆฌ๊ฐ ์์๋ let๊ณผ const์ ํธ์ด์คํ ๋์ง ์๋๊ฑธ๊น? ์์๋ณด์
์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ ์ธ ( var, let, const, function, import๊ตฌ๋ฌธ, class) ์ JavaScript์์ "ํธ์ด์คํธ" ๋๋ค.
์ด๋ ์์ ๊ณ์ ๋งํ๋ฏ ์ด๋ฆ์ด ๋ฒ์์์ ์ ์ธ๋ ๊ฒฝ์ฐ ํด๋น ๋ฒ์์์ ์๋ณ์๊ฐ ํญ์ ์์ ์ธ์๋๊ณ
ํด๋น ํน์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํ์ง๋ง const , let, ํด๋์ค ๊ตฌ๋ฌธ์ ์๋์ ๊ฐ์ด ์คํํด๋ณด๋ฉด ํธ์ด์คํธ ๋์ง ์์๊ฒ ์ฒ๋ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
console.log(hello)
const hello = "Hello frog" //error : ReferenceError
let ํค์๋๋ ์ ์ธ๋ ๋ณ์๋ ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ๋๋์ด์ ์งํ๋๋ค.
ํธ์ด์คํธ์ ์ํด ๋ณ์๋ฅผ ๋ฑ๋ก(์ ์ธ๋จ๊ณ)ํ์ง๋ง ์ด๊ธฐํ ๋จ๊ณ๋ ๋ณ์ ์ ์ธ๋ฌธ์ ๋๋ฌํ์ ๋ ์ด๋ฃจ์ด์ง๋ฉฐ.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์ด๊ธฐํ ์ด์ ์ ๋ณ์์ ์ ๊ทผํ๋ฉด ์ฐธ์กฐ ์๋ฌ(Reference Error)๊ฐ ๋ฐ์ํ๋ค
console.log(num); // Reference Error, TDZ๊ตฌ๊ฐ
let num; // ์ ์ธ๋ฌธ์ ๋๋ฌ ์ด๊ธฐํ ๋จ๊ณ
console.log(num); // undefined
num = 10; // ํ ๋น ๋จ๊ณ
console.log(num); // 10
const
const๋ ์ฌํ ๋น ๋ฐ ์ฌ์ ์ธ์ด ๊ธ์ง๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, const ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ์ ์ธ ๋ฐ ํ ๋น์ ๋์์ ํด์ผ ํ๋ค.
console.log(hello) //error : ReferenceError
const hello = "Hello frog" // ์ ์ธ ํ ๋น์ ๊ผญ ๋์์ ํด์ผํ๋ค
๊ฒฐ๋ก
๋ฐ๋ผ์ var / function(ํจ์) ์ ์ธ๊ณผ let / const / class์ ์ธ ์ ์ฐจ์ด์ ์ ์ด๊ธฐํ ์ด๋ค.
var / function(ํจ์)๋ *์ค์ฝํ ์๋จ์ *๋ฐ์ธ๋ฉ์ด ์์ฑ๋ ๋ ๋ฐ๋ก ๋ณ์ ๋๋ ํจ์๋ undefined๋ก ์ด๊ธฐํ๋๋ค .
let / const / class๋ก ์ ์ธ๋ ๋ณ์๋ ์ด๊ธฐํ ๋์ง ์์ ์ํ๋ก ์ ์ง ๋๋ค.
let / const / class ๋ฌธ์ด ์ค์ ๋ก ์ ์ธ๋ฌธ ์ฝ๋ ์์น์ ๋๋ฌํ์๋๋ง ์ด๊ธฐํ๋๋ค.
TDZ๋ ์ ์ธํ๊ธฐ ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํ์ฉํ์ง ์๋ ๋ค๋ ๊ฒ.
๋ฐ๋๋ก var ๋ณ์๋ ์ ์ธ ์ ์๋ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ์ํค๊ฑฐ๋ ์ค๋ฅ๋ฅผ ์ผ์ผํค๋ ์์ธ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ var ์ฌ์ฉ์ ํผํ๊ณ let๊ณผ const ์ฌ์ฉ์ ์ฃผ๋ก ํ๋ผ
* ์ค์ฝํ : ๋ณ์๊ฐ ๊ฐ์ ์ฐธ์กฐํ ๋ ์ ๊ทผํ ๋ฒ์ ( ์ ์ญ/ ์ง์ญ )
* ๋ฐ์ธ๋ฉ: ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ๋ ๊ตฌ์ฑ ์์์ ์ค์ ๊ฐ ๋๋ ํ๋กํผํฐ๋ฅผ ๊ฒฐ์ ์ง๋ ํ์
๐์ถ์ฒ
https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html
https://nuhends.tistory.com/111
'๋ธ๋ก๊ทธ์ด์ > ๐Technical interview(Front)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ธ๋ผ์ฐ์ ๋์ ์๋ฆฌ (0) | 2022.09.30 |
---|