15.1 var ν€μλλ‘ μ μΈν λ³μμ λ¬Έμ μ
15.1.1 λ³μ μ€λ³΅ μ μΈ νμ©
var ν€μλλ‘ μ μΈν λ³μλ μ€λ³΅ μ μΈμ΄ κ°λ₯ν©λλ€.
15.1.2 ν¨μ λ 벨 μ€μ½ν
var ν€μλλ‘ μ μΈν λ³μλ μ€λ‘μ§ ν¨μμ μ½λ λΈλ‘λ§μ μ§μ μ€μ½νλ‘ μΈμ ν©λλ€. ν¨μ λ 벨 μ€μ½νλ μ μ λ³μλ₯Ό λ¨λ°ν κ°λ₯μ±μ λμ΄κ³ μ μ λ³μκ° μ€λ³΅ μ μΈλλ κ²½μ°κ° λ°μν©λλ€.
15.1.3 λ³μ νΈμ΄μ€ν
var ν€μλ λ³μ μ μΈ μ λ³μ νΈμ΄μ€ν μ μν΄ λ³μ μ μΈλ¬Έμ΄ μ€μ½νμ μ λλ‘ λμ΄ μ¬λ €μ§ κ²μ²λΌ λμν©λλ€.
// μ΄ μμ μλ λ³μ νΈμ΄μ€ν
μ μν΄ μ΄λ―Έ foo λ³μκ° μ μΈλ¨ (1.μ μΈ λ¨κ³)
// λ³μ fooλ undefinedλ‘ μ²κΈ°ν λ¨ (2. μ΄κΈ°ν λ¨κ³)
console.log(foo); // undefined
// λ³μμ κ°μ ν λΉ (3. ν λΉ λ¨κ³)
foo = 123;
console.log(foo); // 123
// λ³μ μ μΈμ λ°νμ μ΄μ μ JS μμ§μ μν΄ μ묡μ μΌλ‘ μ€νλ¨
var foo;
15.2 let ν€μλ
15.2.1 λ³μ μ€λ³΅ μ μΈ κΈμ§
let ν€μλλ‘ μ΄λ¦μ΄ κ°μ λ³μλ₯Ό μ€λ³΅ μ μΈνλ©΄ λ¬Έλ² μλ¬ SyntaxErrorκ° λ°μν©λλ€.
15.2.2 λΈλ‘ λ 벨 μ€μ½ν
var ν€μλλ‘ μ μΈν λ³μλ μ€λ‘μ§ ν¨μμ μ½λ λΈλ‘λ§μ μ§μ μ€μ½νλ‘ μΈμ νλ ν¨μ λ 벨 μ€μ½νλ₯Ό λ°λ¦ λλ€.
15.2.3 λ³μ νΈμ΄μ€ν
var ν€μλλ‘ μ μ΄λ λ³μμ λ¬λ¦¬ letν€μλλ‘ μ μΈν λ³μλ λ³μ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ²μ²λΌ λμν©λλ€. let ν€μλλ‘ μ μΈν λ³μλ μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³κ° λΆλ¦¬λμ΄ μ§νλ©λλ€.
console.log(foo)l // ReferenceError: foo is not defined
let foo;
// var ν€μλλ‘ μ μΈν λ³λ λ°νμ μ΄μ μ μ μΈ, μ΄κΈ°ν λ¨κ³κ° μ€νλ¨
// λ³μ μ μΈλ¬Έ μ΄μ μ λ³μ μ°Έμ‘° κ°λ₯
console.log(foo) // undefined
var foo
console.lof(foo) // undefined
foo = 1; // ν λΉλ¬Έμμ ν λΉ λ¨κ³ μ€ν
console.log(foo) // 1
// λ°νμ μ΄μ μ μ μΈλ¨κ²κ° μ€ν, λ³μκ° μ΄κΈ°νλμ§ μμ
// μ΄κΈ°ν μ΄μ μ λ³μλ₯Ό μ°Έμ‘°ν μ μμ
console.log(foo) // ReferenceError
let foo // λ³μ μ μΈλ¬Έμμ μ΄κΈ°ν μ€ν
console.lof(foo) // undefined
foo = 1; // ν λΉλ¬Έμμ ν λΉ λ¨κ³ μ€ν
console.log(foo) // 1
νμ§λ§ let ν€μλλ‘ μ μΈν λ³μλ μ¬μ ν νΈμ΄μ€ν μ΄ λ°μνλ―λ‘ μ°Έμ‘° μλ¬κ° λ°μν©λλ€.
let foo = 1; // μ μ λ³μ
{
console.log(foo); // ReferenceError
let foo = 2;
}
15.2.4 μ μ κ°μ²΄μ let
let ν€μλλ‘ μ μΈν μ μ λ³μλ μ μ κ°μ²΄μ νλ‘νΌν°κ° μλλλ€. λ°λΌμ window.fooμ κ°μ΄ μ κ·Όν μ μμ΅λλ€.
15.3 const ν€μλ
const ν€μλλ μμ (constant)λ₯Ό μ μΈνκΈ° μν΄ μ¬μ©λ©λλ€.
15.3.1 μ μΈκ³Ό μ΄κΈ°ν
const ν€μλλ‘ μ μΈν λ³μλ λ°λμ μ μΈκ³Ό λμμ μ΄κΈ°ν ν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ SyntaxErrorκ° λ°μν©λλ€.
15.3.2 μ¬ν λΉ κΈμ§
var λλ let ν€μλλ‘ μ μΈν λ³μλ μ¬ν λΉμ΄ μμ λ‘μ°λ const ν€μλλ‘ μ μΈν λ³μλ κΈμ§λ©λλ€.
15.3.3 μμ
const ν€μλλ‘ μ μΈλ λ³μμ μμ κ°μ ν λΉν κ²½μ° μμ κ°μ λ³κ²½ν μ μλ κ° (immutable value)μ΄κ³ const ν€μλμ μν΄ μ¬ν λΉμ΄ κΈμ§λλ―λ‘ ν λΉλ κ°μ λ³κ²½ν μ μλ λ°©λ²μ μμ΅λλ€.
15.3.4 const ν€μλμ κ°μ²΄
const ν€μλλ‘ μ μΈλ λ³μμ κ°μ²΄λ₯Ό ν λΉν κ²½μ° κ°μ λ³κ²½ν μ μμ΅λλ€.
const person = {
name: 'Lee'
}
// κ°μ²΄λ λ³κ²½ κ°λ₯ν κ°
person.name = 'kim'
console.log(person) // {name: "Kim"}
const ν€μλλ μ¬ν λΉμ κΈμ§ν λΏ "λΆλ³"μ μλ―Ένμ§ μμ΅λλ€. μλ‘μ΄ κ°μ μ¬ν λΉνλ κ²μ λΆκ°λ₯νμ§λ§ νλ‘νΌν° λμ μμ±, μμ , κ°μ λ³κ²½μ ν΅ν΄ κ°μ²΄λ₯Ό λ³κ²½νλ κ²μ κ°λ₯ν©λλ€.
15.4 var vs. let vs. const
λ³μ μ μΈμλ κΈ°λ³Έμ μΌλ‘ constλ₯Ό μ¬μ©νκ³ , letμ μ¬ν λΉμ΄ νμν κ²½μ°μλ§ νμ ν΄ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
Reference: λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive