νΈμ΄μ€ν (Hoisting) μ΄λ ?
JavaScriptμμ νΈμ΄μ€ν (hoisting)μ΄λ, μΈν°ν리ν°κ° λ³μμ ν¨μμ λ©λͺ¨λ¦¬ 곡κ°μ μ μΈ μ μ 미리 ν λΉνλ κ²μ μλ―Έν©λλ€.
-MDN-
ν¨μ μμ μλ μ μΈλ€μ λͺ¨λ λμ΄μ¬λ €μ ν΄λΉ ν¨μ μ ν¨ λ²μ(μ€ν 컨ν μ€νΈ)μ μ΅μλ¨μ μ μΈνλ κ².
νΈμ΄μ€ν μ λμ
μλ°μ€ν¬λ¦½νΈμμλ λͺ¨λ μ μΈμ νΈμ΄μ€ν νλ€.
λ³΄ν΅ νΈμ΄μ€ν μ var ν€μλλ‘ μ μΈλ λ³μμμλ§ μΌμ΄λλ€κ³ μκ°νμ§λ§ let, const μμλ νΈμ΄μ€ν μ΄ μΌμ΄λλ€.
λ³μμ μμ± λ¨κ³λ₯Ό μμ보면μ μ΄ν΄ν΄λ³΄μ
λ³μλ 3κ°μ λ¨κ³λ₯Ό κ±°μ³ μμ±μ΄ λλ€.
1. μ μΈλ¨κ³
μλ°μ€ν¬λ¦½νΈμμ λ³μμ μ μΈμ var, const, let ν€μλλ‘ ν μ μμΌλ©°, ES6μμ constμ letμ΄ μΆκ°λμλ€.
μ μΈλ¨κ³μμλ λ³μλ₯Ό μ€ν 컨ν μ€νΈμ λ³μ κ°μ²΄μ λ±λ‘νκ³ μλ°μ€ν¬λ¦½νΈ μμ§μ λ³μμ μ‘΄μ¬λ₯Ό μλ¦°λ€.
μ΄ λ³μ κ°μ²΄λ μ€μ½νκ° μ°Έμ‘°νλ λμμ΄ λλ€.
2. μ΄κΈ°ν λ¨κ³
κ°μ μ μ₯νκΈ° μν λ©λͺ¨λ¦¬ 곡κ°μ ν보νκ³ μ΄ λ¨κ³μμ λ³μμ undefinedλ₯Ό ν λΉν΄ μ΄κΈ°ννλ€.
μ΄κΈ°ν λ¨κ³λ μ΄λ μ μΈ ν€μλλ₯Ό μ¬μ©νλλμ λ°λΌ λ€λ₯΄κ² λνλλ€.
var ν€μλλ₯Ό μ¬μ©ν μ μΈ λ°©μμ κ²½μ°,
var ν€μλλ‘ μ μΈλ λ³μλ μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³κ° νκΊΌλ²μ μΌμ΄λλ€.
μ΄κΈ°ν λ¨κ³μμ undefinedλ‘ μ΄κΈ°νλκΈ° λλ¬Έμ λ³μλ₯Ό μ μΈνκΈ° μ μ λ³μμ μ κ·Όν΄λ μλ¬κ° μΌμ΄λμ§ μλλ€.
μ κ·Όμ΄ κ°λ₯ν΄μ§ var ν€μλλ‘ μ μΈν λ³μλ μ€ν 컨ν μ€νΈμ μ΅μμλ‘ μ΄λνκ² λλ€.
μ½λλ₯Ό ν΅ν΄ μμ보μ.
console.log(age) // undefined
var age = 27
console.log(age) // 27
μ μ½λμμ νμΈ ν μ μλ―μ΄, var ν€μλλ‘ μ μΈν λ³μλ μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³κ° νλ²μ μΌμ΄λκΈ° λλ¬Έμ
ageλ₯Ό console.logλ‘ νμΈν΄λ³΄λ©΄ undefinedλ‘ λμ€κ² λκ³ μ΄ν ν λΉλ¨κ³λ₯Ό κ±°μ³ 27μ΄λΌλ κ°μ΄ μ°νκ² λλ€.
μμ μ½λλ μλμ κ°μ μλ―Έλ₯Ό κ°μ§λ€.
var age
console.log(age) // undefined
age = 27
console.log(age) // 27
var ν€μλλ‘ μ μΈν λ³μκ° νΈμ΄μ€ν μ΄ λμ΄ μ€ν 컨ν μ€νΈμ μ΅μλ¨μΌλ‘ μ΄λνκ³ , μ΄ λ μ μΈκ³Ό μ΄κΈ°νκ° λμμ μΌμ΄λ¬κΈ° λλ¬Έμ
undefined λΌλ κ°μ΄ λμ€κ² λλ κ²μ΄λ€.
λ°λ©΄,
let, const ν€μλλ‘ μ μΈλ λ³μλ var ν€μλλ‘ μ μΈλ λ³μμ λ¬λ¦¬ μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³κ° λΆλ¦¬λμ΄μ μ΄λ£¨μ΄μ§λ€.
μ΄κΈ°ν μ΄μ μ λ³μμ μ κ·Όνλ €κ³ νλ©΄ μ°Έμ‘° μλ¬κ° λ°μνλ€.
μ΄λ λ³μλ₯Ό μν λ©λͺ¨λ¦¬ 곡κ°μ΄ μμ§ ν보λμ§ μμκΈ° λλ¬Έμ΄λ€.
μ€μ½νμ μμ μ§μ λΆν° μ΄κΈ°ν μμ μ§μ κΉμ§μ ꡬκ°μ 'μΌμμ μ¬κ°μ§λ TDZ(Temporal Dead Zone)' λΌκ³ λΆλ₯Έλ€.
μ½λλ₯Ό ν΅ν΄ μμ보μ.
const λ³μ
age; // ReferenceError
const age = 27;
const λ³μλ μ΄κΈ°ν λ¨κ³ μ΄μ κΉμ§ TDZμ μλ€.
let λ³μ
let ν€μλλ‘ μ μΈν λ³μλ constμ λ§μ°¬κ°μ§λ‘ μ΄κΈ°ν λ¨κ³ μ΄μ κΉμ§ TDZμ μλ€.
age; // ReferenceError
console.log(age)
3. ν λΉ λ¨κ³
λ³μμ κ°μ ν λΉ ν λμλ ν λΉ μ°μ°μ(=)λ₯Ό μ¬μ©ν΄μ μ΄λ£¨μ΄μ§λ©° λͺ¨λ μ μΈ ν€μλμ ν λΉμ λ°νμ κ³Όμ μμ μ΄λ£¨μ΄μ§λ€.
var ν€μλ λ³μλ μ€ν 컨ν μ€νΈμ (μ€ν λ¨κ³)μμ μ μΈκ³Ό μ΄κΈ°ν λ¨κ³κ° μ΄λ£¨μ΄μ§κ³ , λ°νμ κ³Όμ μμ ν λΉμ΄ μ΄λ£¨μ΄μ§λ€.
let, const ν€μλ λ³μλ μ€ν 컨ν μ€νΈμ (μ€ν λ¨κ³)μμ μ μΈ λ¨κ³λ§ μ΄λ£¨μ΄μ§κ³ , λ°νμ κ³Όμ μμ μ΄κΈ°ν λ¨κ³λ₯Ό κ±°μ³ λ©λͺ¨λ¦¬ 곡κ°μ
ν보νμ¬ ν λΉ ν κ°(undefined)μ μ μ₯νλ€.
μ΄ν ν λΉ λ¨κ³μμ undefined μΌλ‘ μ΄κΈ°ν λμ΄μλ κ°μ ν λΉλ κ°μΌλ‘ κ΅μ²΄ν΄μ€λ€.
ν¨μ νΈμ΄μ€ν
λ³μμ νΈμ΄μ€ν μ λν΄ μμ보μλ€. μ΄μ ν¨μμ νΈμ΄μ€ν μ λν΄ μμ보μ
ν¨μμ μΈλ¬ΈμΌλ‘ ν¨μλ₯Ό μ μν κ²½μ°
getAge(27); // μ μλμ
function getAge(age) {
console.log(age) //27
}
getAge(27); // μ μλμ
ν¨μμ μΈλ¬Έμ TDZμ μν₯μ λ°μ§ μλλ€. νμ¬ μ€μ½νμμ νΈμ΄μ€ν λλ€.
ν¨μ ννμ, νμ΄ν ν¨μλ‘ ν¨μλ₯Ό μ μν κ²½μ°
getAge(27)
var getAge = (age) => { // TypeError: getAge is not a function
console.log(age)
}
var getAge = function (age) { // TypeError: getAge is not a function
console.log(age)
}
getAge(27)
λ°λ©΄ ν¨μννμκ³Ό νμ΄ν ν¨μλ‘ ν¨μλ₯Ό μ μνκΈ° μ΄μ μ ν¨μλ₯Ό νΈμΆν κ²½μ°μλ μλ¬κ° λ°μνλ€.
νΈμ΄μ€ν μ΄ μΌμ΄λμ§λ§ varλ‘ μ μΈνκΈ° λλ¬Έμ getAgeμλ undefinedκ° μ΄κΈ°ν λμ΄ μλ κ²μ΄λ€
μ ν¨μλ₯Ό let, const λ‘ μ μΈνμ κ²½μ°μλ ν¨μλ₯Ό μ μνκΈ° μ μ νΈμΆνλ€λ μλ¬κ° λ°μνκ² λλ€ !
var, let, constμ μ°¨μ΄
μμμ νμΈνλ―μ΄ var ν€μλλ‘ ν¨μλ₯Ό μ μΈνλ κ²½μ°μλ λ¬Έμ μ μ΄ λ§λ€.
- λ³μ μ€λ³΅ μ μΈ κ°λ₯νλ€.
- ν¨μ λ 벨 μ€μ½νμ΄κΈ° λλ¬Έμ ν¨μκ° μλ κ³³μμ μ μΈν λ³μλ λͺ¨λ μ μ λ³μλ‘ μ·¨κΈνλ€.
- λ³μμ ν λΉ λ¨κ³λ₯Ό κ±°μΉκΈ° μ΄μ μλ νμ undefinedλ₯Ό κ°μ§λ€.
μ΄λ¬ν varμ λ¬Έμ μ μ ν΄κ²°νκΈ°μν΄ es6μμ letκ³Ό constκ° νμνλ€.
λ³μμ μ€λ³΅ μ μΈ μ ν
let ν€μλμ const ν€μλλ κ°μ μ€μ½ν λ΄μμ μ€λ³΅ μ μΈμ νμ©νμ§ μλλ€. μ€λ³΅ μ μΈνλ©΄ λ¬Έλ²μλ¬SyntaxErrorκ° λ°μνλ€.
function getAge() {
let age = 27;
let age = 26;
// μ€λ³΅ μ μΈμΌλ‘ μΈν΄ μλ¬ λ°μ
return age;
}
letκ³Ό constμ μ°¨μ΄μ μ΄λΌλ©΄
constλ λ³μμ μ μΈκ³Όν¨κ» μ΄κΈ°νλ₯Ό νμ§ μμΌλ©΄ μλ¬κ° λ°μνλ€ .
let age // undefined
console.log(age)
const age // Error
console.log(age)
const age = 27
console.log(age) // 27
λΈλ‘ λ 벨 μ€μ½ν
varν€μλλ ν¨μ λ 벨 μ€μ½νμ΄λ€.
νμ§λ§ letν€μλμ const ν€μλλ‘ μ μΈν λ³μλ λͺ¨λ μ½λ λΈλ‘(ν¨μ,ifλ¬Έ, forλ¬Έ, whileλ¬Έ, try/catchλ¬Έ λ±)μ μ§μ μ€μ½νλ‘ μΈμ νλ λΈλ‘ λ 벨 μ€μ½νλ₯Ό λ°λ₯Έλ€.
let age = 27; // μ μ λ³μ
{
let age = 30; // μ§μ λ³μ
let name = 'song'; // μ§μ λ³μ
}
console.log(age); // 27
console.log(name); // ReferenceError: name is not defined
λΈλ‘λ 벨 μ€μ½νμ΄κΈ° λλ¬Έμ λΈλ‘ μμ μ€μ½νμμ μ μΈλ ν¨μλ λΈλ‘ λ°μμ μ κ·Όν μ μλ€
κ·Έλ¬λ―λ‘ nameμ μ μΈλμ§ μμλ€κ³ μΈμμ΄ λλ κ²μ΄λ€
νμ§λ§ λ³μλ€μ varλ‘ μ μΈνλ€λ©΄ λͺ¨λ λ³μλ€μ΄ μ μλ³μλ‘ νΈμ΄μ€ν λμ΄ λΈλ‘ λ΄μμ μ μΈν λ³μλ€μ κ°μ΄ μΆλ ₯μ΄ λλ€.
νΈμ΄μ€ν
varμ let, constμ μΈμ μ°¨μ΄ μ€ νλλ let, constκ° TDZμ μν΄ μ μ½μ λ°λλ€λ κ²μ΄λ€.
μ¦, λ³μκ° μ΄κΈ°νλκΈ° μ μ μ κ·Όνλ € νλ©΄, varμ²λΌ undefinedλ₯Ό λ°ννμ§ μκ³ , ReferenceErrorκ° λ°μνλ€.
let age = 27;
function getAge() {
console.log(age); // ReferenceError
let age = 28;
};
μμ μ½λμμ letμΌλ‘ μ μΈν λ³μμμ νΈμ΄μ€ν μ΄ μΌμ΄λλ€λ κ²μ μ μ μλ€.
νΈμ΄μ€ν μ΄ λμ§ μλλ€λ©΄ console.log μμλ μ μμμ μ μΈν ageμΈ 27μ΄ μΆλ ₯μ΄ λμ΄μΌ νμ§λ§
νΈμ΄μ€ν μ΄ λμκΈ° λλ¬Έμ ReferenceErrorλ₯Ό λ°μμν€λ κ²μ΄λ€.
undefinedλ₯Ό λ°ννλ varμλ λ¬λ¦¬, μ΄κΈ°νλκΈ° μ μ μ κ·Όνλ©΄ μλ¬κ° λ°μνλ€.
constμ μ¬ν λΉ κΈμ§
const age = 27;
age = 28; // TypeError: Assignment to constant variable.
constλ‘ μ μΈν λ³μλ μ¬ν λΉμ΄ κΈμ§λμ΄μλ€. νμ§λ§ letμΌλ‘ μ μΈν λ³μλ μ¬ν λΉμ΄ κ°λ₯νλ€
const λ³μμ κ°μ²΄λ₯Ό ν λΉν κ²½μ°
const λ³μμ νμ μ΄ κ°μ²΄μΈ κ²½μ°, κ°μ²΄μ λν μ°Έμ‘°λ₯Ό λ³κ²½νμ§ λͺ»νλ€λ κ²μ μλ―Ένλ€. νμ§λ§ κ°μ²΄ λ΄λΆμ κ°μ λ³κ²½μ΄ κ°λ₯νλ€.
const person = { // κ°μ²΄λ₯Ό μμλ‘ μ μΈ
age: 27,
}
person = { // κ°μ²΄κ° λ΄κ²¨μλ μ°Έμ‘°λ λ³κ²½ λΆκ°λ₯ λλ¬Έμ Error
age: 26,
}
person.age = 26; // κ°μ²΄κ° κ°μ§κ³ μλ valueλ λ³κ²½μ΄ κ°λ₯
console.log(person.age)
μ 리
λ³μλ₯Ό μ μΈν λ var ν€μλλ‘ μ μΈνκΈ° 보λ€λ let, const λ‘ μ μΈνλλ‘ νμ
λ³νμ§ μλ κ°μ΄ νμνλ€λ©΄ μμλ₯Ό μ μΈν const ν€μλλ₯Ό μ¬μ©νκ³ μ¬ν λΉμ΄ νμνλ€λ©΄ let ν€μλλ₯Ό μ¬μ©νλλ‘ νμ.
Reference
https://ui.toast.com/weekly-pick/ko_20191014
https://wonism.github.io/is-let-hoisted/
'JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μλ°μ€ν¬λ¦½νΈκ° μ±κΈμ€λ λμ§λ§ λΉλκΈ°λ‘ λμνλ μ΄μ (0) | 2022.03.11 |
---|---|
λΈλΌμ°μ λ λλ§ μ리 ( Critical Rendering Path ) (0) | 2021.12.01 |
JavaScript (ES6) - μλ² ν΅μ μ μμ JSON (0) | 2021.05.23 |
JavaScript (ES6) - Array APIs μ΄μ 리 - ( μ μ©ν 10κ°μ§ λ°°μ΄ ν¨μ ) (0) | 2021.05.23 |
JavaScript (ES6) - Prototype (0) | 2021.05.20 |