"Hoisting"
Hoisting ?
๋ณธ๊ฒฉ์ ์ธ ํฌ์คํ ์ ์์ Hoisting(ํธ์ด์คํ )์ด๋ผ๋ ๊ฐ๋ ์ ๋จผ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค.
- ์ด์: Hoisting `๋ช ์ฌ` ๋์ด ์ฌ๋ฆฌ๊ธฐ, ๋ค์ด์ฌ๋ ค ๋๋ฅด๊ธฐ
Hoisting(ํธ์ด์คํ )์ ๋ณ์ ์ ์ธ๊ณผ ํจ์ ์ ์ธ์ด ์ฝ๋ ์คํ ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์ต์๋จ์ผ๋ก ๋์ด ์ฌ๋ ค์ง๋ ํ์์ ๋งํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์์ฑ๋ ์์๋๋ก ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์์์น ๋ชปํ ๋์์ ๊ฒฝํํ ์ ์๋ค.
์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ๋ณ์ ์ ์ธ๊ณผ ํจ์ ์ ์ธ์ด ์ฝ๋์ ์ต์๋จ์ผ๋ก ์ด๋๋๋ค. ์ด๋ ์ ์ธ๋ง ์ด๋๋๋ฉฐ, ๋ณ์์ ๊ฐ ํ ๋น์ ํธ์ด์คํ ๋์ง ์๋๋ค.
JavaScript ํธ์ด์คํ ์ ์ธํฐํ๋ฆฌํฐ๊ฐ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ํจ์, ๋ณ์, ํด๋์ค ๋๋ ์ํฌํธ(import)์ ์ ์ธ๋ฌธ์ ํด๋น ๋ฒ์์ ๋งจ ์๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ํ์์ ๋ปํฉ๋๋ค. https://developer.mozilla.org/ko/docs/Glossary/Hoisting
์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์, ํจ์ ์ ์ ๋ฐ ์ฌ์ฉ
์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์ ์ ์ธ ๋ฐฉ๋ฒ : var → let, const
ES6 (ESMAScript, ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ์ ) ์ด์ ์๋ ๋ณ์๋ฅผ ์ ์ธํ ๋ `var`๋ง ์ฌ์ฉํ๋ค. ES6 ์ดํ๋ก๋ `let`๊ณผ `const`๊ฐ ๋์ ๋๋ฉด์ `let`๊ณผ `const`๋ก ์ ์ธํ ์ ์๋ค.
- `let`: ๊ฐ๋ณ ๋ณ์ ์ ์ธ ์ - ์) `let heroLevel =1` ๋ ๋ฒจ์ด ์ฌ๋ผ๊ฐ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ ๋ ๋ฒจ๊ฐ
- `const`: ๋ถ๋ณ ๋ณ์ ์ ์ธ ์ - ์)`const TOTAL_MONTHS = 12` ๊ณ ์ ๋ 12๋ผ๋ ๊ฐ
์ฌ์ ์ธ | ์ฌํ ๋น | ์ค์ฝํ | |
var | O: ์ฌ์ ์ธ ์ ๋ฎ์ด์ฐ๊ธฐ | O | ํจ์ |
let | X: ๋ฐฉ์ด | O: ๊ฐ๋ณ ๋ณ์ | ๋ธ๋ก |
const | X: ๋ฐฉ์ด | X: ๋ถ๋ณ ๋ณ์ | ๋ธ๋ก |
- `var` : ์ฌ์ ์ธ๊ณผ ์ฌํ ๋น์ด ๊ฐ๋ฅํ๊ณ ํจ์ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ค. ์ ์ธํ ๋ณ์๋ฅผ ์ด๋์๋ ์ฐธ์กฐํ ์ ์์ง๋ง, ์ด๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ํธ์ด์คํ ๋ฐ์: ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ค. ๊ฐ์ด ํ ๋น๋์ง ์์ผ๋ฉด undefined๋ก ์ด๊ธฐํ๋๋ค.
- `let`: ์ฌ์ ์ธ์ ๋ถ๊ฐ๋ฅํ์ง๋ง ์ฌํ ๋น์ ๊ฐ๋ฅํ๋ค. ๋ธ๋ก ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ค.
- ํธ์ด์คํ ๋ฐ์: ์ ์ธ์ ํธ์ด์คํ ๋์ง๋ง, ์ด๊ธฐํ๋ ํธ์ด์คํ ๋์ง ์๋๋ค. ๊ทธ๋์ ์ ์ธ ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด Reference Error๊ฐ ๋ฐ์ํ๋ค.
- `const`: ์ฌ์ ์ธ๊ณผ ์ฌํ ๋น ๋ชจ๋ ๋ถ๊ฐ๋ฅํ ์์ ๋ณ์. ๋ธ๋ก ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ค.
- ํธ์ด์คํ ๋ฐ์: ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ธ์ ํธ์ด์คํ ๋์ง๋ง, ์ด๊ธฐํ๋ ํธ์ด์คํ ๋์ง์๋๋ค. ์ ์ธ ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด Reference Error๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ var, let, const๋ ๋ชจ๋ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ค.
console.log(a); // undefined
var a = 10;
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 20;
+) ํจ์(Function)๋ Hoisting
ํจ์ ์ ์ธ๋ Hoisting์ ์ํฅ์ ๋ฐ๋๋ค. ํจ์ ์ ์ธ์ ์ฝ๋ ์์์ ์ด๋์ ์๋ ํธ์ด์คํ ๋๊ธฐ ๋๋ฌธ์ ํจ์ ํธ์ถ์ด ์ ์ธ๋ณด๋ค ์์๋ ๋ฌธ์ ์์ด ๋์ฅํ๋ค.
hoistedFunction(); // ์ ์์ ์ผ๋ก ํธ์ถ๋จ
function hoistedFunction() {
console.log("This function is hoisted");
}
๊ทธ๋ฌ๋ ํจ์ ํํ์์ ๋ณ์์ฒ๋ผ ๋์ํ๋ค. ์ฆ, ํจ์ ํํ์์ ์ ์ธ์ด ํธ์ด์คํ ๋์ง๋ง, ํ ๋น๋ ๊ฐ์ ํธ์ด์คํ ๋์ง ์๋๋ค.
hoistedExpression(); // TypeError: hoistedExpression is not a function
var hoistedExpression = function() {
console.log("This is a function expression.");
};
์ค์ฝํ(Scope): ๋ณ์์ ๋ํ ์ ๊ทผ ์์ญ
์ค์ฝํ(Scope)๋, ์ฝ๋์์ ๋ณ์๋ฅผ ์ด๋์์ ์ ์ธํ๊ณ , ๋ ์ด๋์ ์ ๊ทผํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ท์น์ด๋ค.
์ค์ฝํ๋ ํจ์ ์ค์ฝํ์ ๋ธ๋ก ์ค์ฝํ๋ก ๋๋ ์ ์๋ค. ์ด ๋ ์ค์ฝํ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฒ์๋ฅผ ๋ค๋ฅด๊ฒ ์ ์ํ๊ธฐ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ฑ ์ ํฐ ์ํฅ์ ๋ผ์น๋ค.
- ํจ์ ์ค์ฝํ (Function Scope)
ํจ์ ์ค์ฝํ๋ ํจ์๊ฐ ์์ฑ๋ ๋ ํด๋น ํจ์ ๋ด๋ถ์์๋ง ์ ํจํ ์ค์ฝํ. ์ด๋ ํจ์ ๋ด์์ ์ ์ธ๋ ๋ณ์๋ ํจ์ ๋ฐ์์๋ ์ ๊ทผํ ์ ์์์ ๋ปํ๋ค. ๋ณ์๊ฐ ํจ์ ๋ด์๋ง ํ์ ๋๋ฏ๋ก ์ธ๋ถ์์ ๊ทธ ๋ณ์์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ ์ ์๋ค.
fucntion function_scope() {
var message = 'Hello'; // ํจ์ ์ค์ฝํ ๋ด์์๋ง ์ ํจ
console.log(message); // 'Hello' ์ถ๋ ฅ
}
console.log(message); // ReferenceError: message is not defined
์ ์ฝ๋์์ `message` ๋ณ์๊ฐ ํจ์ ๋ด๋ถ์ ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ ํจ์ ๋ฐ๊นฅ์์๋ ์ฌ์ฉํ ์ ์๋ค.
- ๋ธ๋ก ์ค์ฝํ (Block Scope)
๋ธ๋ก ์ค์ฝํ๋ ์ค๊ดํธ `{}`๋ก ๊ฐ์ธ์ง ๋ธ๋ก ๋ด์์๋ง ์ ํจํ ์ค์ฝํ. ๋ธ๋ก ์ค์ฝํ๋ `let`์ด๋ `const` ํค์๋๋ฅผ ์ฌ์ฉํ ๋ ์ ์ฉ๋๋ฉฐ, ํด๋น ๋ธ๋ก ์ธ๋ถ์์๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. `if`, `for`, `while` ๋ฑ์ ์ ์ด๋ฌธ ๋๋ ํจ์ ๋ด์ ์ฝ๋ ๋ธ๋ก์์๋ ๊ฐ๊ฐ์ ์ค์ฝํ๊ฐ ์กด์ฌํ๋ค.
if (true) {
let blockVariable = 'I am inside block';
console.log(blockVariable); // 'I am inside block' ์ถ๋ ฅ
}
console.log(blockVariable); // RenferenceError: blockVariable is not defined
`blockVariable`์ ๋ธ๋ก ๋ด์์๋ง ์ ์ธ๋์๊ธฐ ๋๋ฌธ์, ๋ธ๋ก ๋ฐ์์๋ ์ฌ์ฉํ ์ ์๋ค.
Literal ๋ฆฌํฐ๋ด์ด๋ ๋ฌด์๊ธด๊ฐ?
๋ฆฌํฐ๋ด(Literal)์ ์ฝ๋์์ ๊ฐ์ ํํํ๋ ๋ฐฉ๋ฒ์ ์๋ฏธํ๋ค. ์ฆ, ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํ ๊ฐ ๊ทธ ์์ฒด๋ฅผ ๋งํ๋ค.
- ์ซ์ ๋ฆฌํฐ๋ด: `0`, `3.14`, `100`
- ๋ฌธ์์ด ๋ฆฌํฐ๋ด: `hello`, "world"
- ํจ์ ๋ฆฌํฐ๋ด: `function() {}`, `() => {}`
- ๊ฐ์ฒด ๋ฆฌํฐ๋ด: `{ name: 'SangHyun', age: 28 }`
๋ฆฌํฐ๋ด์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฝ๋์ ์ ์ด ๋ฃ๋ ๊ฒ์ ๋ปํ๋ฉฐ ๋ณ์์ ๊ฐ์ ํ ๋นํ๊ฑฐ๋ ๋น๊ตํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
โน๏ธ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
https://developer.mozilla.org/ko/docs/Glossary/Hoisting
'๐ปDEV-STUDY > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JavaScript ํจ์ ๋ด this์ ๋ฉ์๋ ๋ด this ์ฐจ์ด (1) | 2024.09.09 |
---|---|
JavaScript ํจ์ ์์ฑ ๋ฐฉ๋ฒ (1) | 2024.09.08 |
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํ ๋ฐฉ์ = ํจ์ ์คํ ์๋ฆฌ (0) | 2024.09.05 |
JavaScript ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์ (4) | 2024.09.04 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋์ ์๋ฆฌ (0) | 2024.08.19 |