TDZ(Temporal Dead Zone)λ 무μμΈκ°?
const λ³μλ₯Ό μ μΈνκ³ μ΄κΈ°ννλ©΄ λ³μμ μ κ·Όν μ μμ΅λλ€. μμνλλ‘ λμν©λλ€.
const white = '#FFFFFF';
white; // => '#FFFFFF'
μ΄λ²μλ μ μΈ μ μ white λ³μμ μ κ·Όν΄λ³΄λλ‘ νκ² μ΅λλ€.
white; // throws `ReferenceError`
const white = '#FFFFFF';
white
const white = '#FFFFFF' ꡬ문 μ μ€κΉμ§, white λ³μλ TDZμ μμ΅λλ€.
TDZμ μλ white λ³μμ μ κ·Όνκ² λλ©΄ , ReferenceError: Cannot access 'white' before initialization μλ°μ€ν¬λ¦½νΈ μλ¬κ° λ°μν©λλ€.
TDZμ μν₯μ λ°λ ꡬ문
const λ³μ
μ΄μ μ 보μλ―μ΄, const λ³μλ μ μΈ λ° μ΄κΈ°ν μ μ€κΉμ§ TDZμ μμ΅λλ€.
// Does not work!
pi; // throws `ReferenceError`
const pi = 3.14;
const λ³μλ μ μΈν νμ μ¬μ©ν΄μΌ ν©λλ€.
const pi = 3.14;
// Works!
pi; // => 3.14
let λ³μ
letλ μ μΈ μ μ€κΉμ§ TDZμ μν₯μ λ°μ΅λλ€.
// Does not work!
count; // throws `ReferenceError`
let count;
count = 10;
λ€μ, let λ³μλ μ μΈ μ΄νμ μ¬μ©ν΄μΌ ν©λλ€.
let count;
// Works!
count; // => undefined
count = 10;
// Works!
count; // => 10
class ꡬ문
λ¨Έλ¦¬λ§ λΆλΆμμ 보μλ―μ΄, μ μΈ μ μλ classλ₯Ό μ¬μ©ν μ μμ΅λλ€.
// Does not work!
const myNissan = new Car('red'); // throws `ReferenceError`
class Car {
constructor(color) {
this.color = color;
}
}
μ΄ μμ κ° λμνλ €λ©΄, ν΄λμ€λ₯Ό μ μΈν νμ μ¬μ©νλλ‘ μμ ν©λλ€.
class Car {
constructor(color) {
this.color = color;
}
}
// Works!
const myNissan = new Car('red');
myNissan.color; // => 'red'
constructor() λ΄λΆμ super()
λΆλͺ¨ ν΄λμ€λ₯Ό μμλ°μλ€λ©΄, μμ±μ μμμ super()λ₯Ό νΈμΆνκΈ° μ κΉμ§ this λ°μΈλ©μ TDZμ μμ΅λλ€.
class MuscleCar extends Car {
constructor(color, power) {
this.power = power;
super(color);
}
}
// Does not work!
const myCar = new MuscleCar(‘blue’, ‘300HP’); // `ReferenceError`
μ΄ μ½λλ₯Ό 보면 constructor() μμμ super()κ° νΈμΆλκΈ° μ κΉμ§ thisλ₯Ό μ¬μ©ν μ μμ΅λλ€.
TDZλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννκΈ° μν΄ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆν κ²μ μ μν©λλ€. λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνκ³ μΈμ€ν΄μ€κ° μ€λΉλλ©΄ μμ ν΄λμ€μμ this κ°μ λ³κ²½ν μ μμ΅λλ€.
class MuscleCar extends Car {
constructor(color, power) {
super(color);
this.power = power;
}
}
// Works!
const myCar = new MuscleCar('blue', '300HP');
myCar.power; // => '300HP'
κΈ°λ³Έ ν¨μ 맀κ°λ³μ(Default Function Parameter)
κΈ°λ³Έ 맀κ°λ³μλ κΈλ‘λ²κ³Ό ν¨μ μ€μ½ν μ¬μ΄μ μ€κ° μ€μ½ν(intermidiate scope)μ μμΉν©λλ€. κΈ°λ³Έ 맀κ°λ³μ λν TDZ μ νμ΄ μμ΅λλ€.
const a = 2;
function square(a = a) {
return a * a;
}
// Does not work!
square(); // throws `ReferenceError`
κΈ°λ³Έ 맀κ°λ³μ aλ μ μΈ μ μ a = a ννμμ μ€λ₯Έμͺ½μμ μ¬μ©λμμ΅λλ€. aμμ μ°Έμ‘° μλ¬κ° λ°μν©λλ€.
κΈ°λ³Έ 맀κ°λ³μλ μ μΈ λ° μ΄κΈ°ν λ€μμ μ¬μ©λμ΄μΌ ν©λλ€. μ΄ κ²½μ° initκ³Ό κ°μ λ€λ₯Έ λ³μλ‘ μ μΈνμ¬ μ¬μ©ν©λλ€.
const init = 2;
function square(a = init) {
return a * a;
}
// Works!
square(); // => 4
var, function, import ꡬ문
μμμ μ€λͺ ν κ²λ€κ³Ό λ°λλ‘ var, function μ μΈμ TDZμ μν₯μ λ°μ§ μμ΅λλ€. μ΄κ²λ€μ νμ¬ μ€μ½νμμ νΈμ΄μ€ν λ©λλ€.
var λ³μλ μ μΈνκΈ° μ μ μ κ·Όνλ©΄, undefinedλ₯Ό μ»κ² λ©λλ€.
// Works, but don't do this!
value; // => undefined
var value;
κ·Έλ¬λ ν¨μλ μ μΈλ μμΉμ μκ΄μμ΄ λμΌνκ² νΈμΆλ©λλ€.
// Works!
greet('World'); // => 'Hello, World!'
function greet(who) {
return `Hello, ${who}!`;
}
// Works!
greet('Earth'); // => 'Hello, Earth!'
λΉμ μ ν¨μ ꡬνλ³΄λ€ νΈμΆμ λ κ΄μ¬μ΄ μκΈ° λλ¬Έμ μ’ μ’ ν¨μ μ μΈ μ μ νΈμΆνκ² λ©λλ€. ν¨μ μ μΈ μ μ νΈμΆν΄λ μλ¬κ° λ°μνμ§ μλ μ΄μ λ νΈμ΄μ€ν λλ¬Έμ λλ€.
ν₯λ―Έλ‘μ΄ μ μΌλ‘ import λͺ¨λ μμ νΈμ΄μ€ν λ©λλ€.
// Works!
myFunction();
import { myFunction } from './myModule';
import κ΅¬λ¬Έμ΄ νΈμ΄μ€ν λκΈ° λλ¬Έμ, μλ°μ€ν¬λ¦½νΈ νμΌ μμ λΆλΆμμ λνλμ λͺ¨λμ κ°μ Έμ€λ κ²μ΄ μ’μ΅λλ€.
TDZμμ typeof μ°μ°μμ λμ
typeof μ°μ°μλ λ³μκ° νμ¬ μ€μ½ν μμ μ μΈλμλμ§ νμΈν λ μ μ©ν©λλ€.
μλ₯Ό λ€μ΄μ, notDefined λ³μλ μ μΈλμ§ μμμ΅λλ€. μ΄ λ³μμ typeof μ°μ°μλ₯Ό μ μ©νλ©΄ μλ¬κ° λ°μν©λλ€.
typeof notDefined; // => 'undefined'
λ³μκ° μ μΈλμ§ μμκΈ° λλ¬Έμ, typeof notDefinedλ undefinedλ‘ νκ°ν©λλ€.
κ·Έλ¬λ TDZμ λ³μμμ typeof μ°μ°μλ₯Ό μ¬μ©νλ©΄ λ€λ₯΄κ² λμν©λλ€. λ€μκ³Ό κ°μ κ²½μ°μ μλ¬κ° λ°μν©λλ€.
typeof variable; // throws `ReferenceError`
let variable;
νμ¬ μ€μ½ν μμμ TDZ λμ
TDZμ μ μΈλ¬Έμ΄ μ‘΄μ¬νλ μ€μ½ν λ²μ μμμ λ³μμ μν₯μ μ€λλ€.
μμ λ₯Ό 보κ²λλ©΄,
function doSomething(someVal) {
// Function scope
typeof variable; // => undefined
if (someVal) {
// Inner block scope
typeof variable; // throws `ReferenceError`
let variable;
}
}
doSomething(true);
μ΄ μ½λλ 2κ°μ μ€μ½νλ₯Ό κ°μ§λλ€.
- ν¨μ μ€μ½ν
- let λ³μκ° μ μΈλ λ΄λΆ λΈλ‘ μ€μ½ν
ν¨μ μ€μ½νμμ typeof variable
λ undefined
λ‘ νκ°λ©λλ€. μ¬κΈ°μλ let variable
ꡬ문μ TDZμ μν₯μ μ£Όμ§ μμ΅λλ€.
typeof variable
ꡬ문μ λ΄λΆ μ€μ½νμμλ μ μΈ μ μ λ³μλ₯Ό μ¬μ©νλ©΄ ReferenceError: Cannot access 'variable' before initialization μλ¬κ° λ°μν©λλ€. TDZλ λ΄λΆ μ€μ½νμμλ§ μ‘΄μ¬ν©λλ€.
References
'π₯ Front-End > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JS] ES6 (0) | 2022.07.24 |
---|---|
[JS] μ€ν 컨ν μ€νΈ, νΈμ΄μ€ν , ν¨μ μ μΈλ¬Έκ³Ό ν¨μ ννμ (0) | 2022.07.21 |
[JS] ν΄λ‘μ (Closure) (0) | 2022.07.21 |
[JS] μ€μ½ν(Scope) (0) | 2022.07.21 |
[JS] JavaScript κ°μ²΄μ λΆλ³μ± (0) | 2022.07.20 |