March 28, 2021
κ³Όκ±°μ λ΄κ° μμ±ν λΈλ‘κ·Έλ₯Ό ν΅ν΄ μ¬λ³΅μ΅μ μ§νν μ μμλ€.
https://dev-seolleung2.netlify.app/development/Scope/
λ΄ λΈλ‘κ·Έ λ΄μ©μ μ‘°κΈ λ μμ½ν΄ 보μλ€.
μ€μ½νλ λ³μ μ κ·Ό κ·μΉμ λ°λ₯Έ μ ν¨ λ²μλ₯Ό μλ―Ένλ©° μ’ λ ꡬ체μ μΌλ‘λ λ³μμ κ·Έ κ°μ΄ μ΄λμλΆν° μ΄λκΉμ§ μ ν¨νκ°μ λν λ²μ μ΄λ€.
μ€μ½νμ νΉμ±μ
let κ³Ό var μ μ°¨μ΄λ₯Ό μ΄μΌκΈ° νκΈ° μ μ λ°λ‘ μ΄ Scope μμ Function Scope μ Block Scope μ λν μ°¨μ΄λ₯Ό μμμΌ νλ€.
μλ°μ€ν¬λ¦½νΈλ κΈ°λ³Έμ μΌλ‘ ν¨μ λ¨μλ‘ μμ λ§μ μ€μ½νλ₯Ό κ°μ§λλ° μ΄λ₯Ό Function Scope λΌ νλ©° var λ³μλ Function Scope λ₯Ό λ°λ₯΄κ² λλ€.
νμ§λ§ Curly-Bracket μΌλ‘ μ΄λ£¨μ΄μ§ Block λ¨μλ‘ Scope λ₯Ό ꡬλΆνμ λ Function Scope λ³΄λ€ λ μμΈ‘νκΈ° μ¬μ΄ μ½λλ₯Ό μμ±ν μ μλ€.
let κ³Ό const ν€μλκ° Block Scope μ μ¬μ©λλ λ³μμ΄λ€. Block Scope μμμ λ³μ μ¬μ©μ ν΄λΉ λΈλ‘ (Curly Bracket) μμ λ³μκ° κ°νκ² λλ€.
Block Scope λ₯Ό ν΅ν΄ λ³μμ μ ν¨ λ²μκ° λμ ν λ€μ΄μ€λλ‘ ν μ μκΈ° λλ¬Έμ΄λ€. var μ μ¬μ©νλ©΄ μμμΉ λͺ»νκ² μ¬μ¬μ©μ νκ² λλ μνμ±μ΄ μ‘΄μ¬ν μ μλ€.
let κ³Ό const μ μ ν¨ λ²μλ κ·Έλμ Block Scope λ₯Ό λ°λ₯΄λ©° λ λ³μ λͺ¨λ μ¬μ μΈμ΄ λΆκ°λ₯ νλ€.
νμ§λ§ let ν€μλλ κ°μ μ¬μ μ (μ¬ν λΉ) ν μ μμ§λ§ const λ κ°μ μ¬μ μ νλ κ²μ΄ λΆκ°λ₯ νλ€.
var ν€μλλ Function Scope λ₯Ό λ°λ₯΄λ©° (old way) κ° μ¬μ μμ μ¬μ μΈμ΄ κ°λ₯νλ€.
var ν€μλλ μ¬μ μΈμ΄ κ°λ₯νμ§λ§ let μ μ¬μ μΈμ΄ λΆκ°λ₯ νλ€λ μ μ μΌλμ λ μνμμ λ€μ΄κ°λ³΄μ.
μλμ μ½λλ₯Ό νλ²μ κ°λ°μ λꡬ console μ μ λ ₯ν μν°λ₯Ό μ³ λ³΄μλ€.
console.log(myname)
var myname = 'mook'
undefined λΌ λ¨λ κ² μ΄μΈμλ μ무 μλ¬ λ©μμ§κ° λ¨μ§ μλλ€.
μλνλ©΄ var λ‘ μ μΈλ λͺ¨λ λ³μλ μ½λκ° μ€μ λ‘ μ΄λνμ§λ μμ§λ§ μ½λκ° μ΅μμλ‘ λμ΄μ¬λ €μ§ κ²μ²λΌ λμνκ² λλ€.
μ΄λ₯Ό βHoistingβ μ΄λΌ νλ€.
var myname
console.log(myname) // undefined
myname = 'mook'
μμ μ½λμ²λΌ λμνλ κ²μ΄λ€! κ·Έλ°λ° console.log μμλ undefined κ° λ¨λ μ΄μ λ?
κ·Έκ²μ λ°λ‘ μ μΈ (declaration) μ νΈμ΄μ€ν μ΄ λμ§λ§ ν λΉ (assignment) μ νΈμ΄μ€ν μ΄ λμ§ μκΈ° λλ¬Έμ΄λ€. myname μ΄λΌλ λ³μλ§ μ¬λ €μ§ κ²μ΄κ³ βmookβ μ΄λΌλ ν λΉλ κ°μ κ·Έ μ리μ μλ κ²μ΄λ€.
μμ μ½λμ²λΌ ν λΉμ μΈ λ²μ§Έ μ€μμ μ²λ¦¬κ° λλ€.
μμ μ½λμ κ°μ μν©μμ μλμ μ½λλ₯Ό λμμ 볡μ¬ν΄ κ°λ°μ λꡬμ λ£κ³ μν°λ₯Ό μΉλ©΄,
console.log(myname)
let myname = 'mook'
Reference Error λ₯Ό μΌμΌν¨λ€.
κ·ΈλΌ let μ μΌμ λλ Hoisting μ΄ μ λλ κ±ΈκΉ?
νμ§λ§ let κ³Ό const λ νΈμ΄μ€ν μ΄ λλ€.
μ€μ½ν λ΄λΆ μ΄λμλ λ³μ μ μΈμ μ΅μμμ μ μΈλ κ²μ²λΌ νλνλ€λ λ»μ΄λ€.
let λ νΈμ΄μ€ν μ΄ λλ€λ©΄ μ var ν€μλ μ²λΌ λμνμ§ μκ³ λ νΌλ°μ€ μλ¬λ₯Ό λΌκΉ?
κ·Έκ²μ λ°λ‘ Temporal Dead Zone (TDZ) λΌλ κ² λλ¬Έμ κ·Έλ λ€κ³ νλ€.
let κ³Ό const ν€μλλ λ°λ‘ μ΄ TDZ μ μν₯μ λ°λλ€.
μ¦, κ° ν λΉμ νκΈ° μ μλ μ¬μ©ν μ μλ€. ν λΉ μ΄μ μ μ½λλ μ¬μ©ν μ μλ TDZ μμ μ΄λΌλ κ²μ΄λ€.
μ΄λ¬ν κ²λ€μ μ½λλ₯Ό μμΈ‘ κ°λ₯νκ² νκ³ μ μ¬μ μΈ λ²κ·Έλ₯Ό μ€μΌ μ μλ€κ³ νλ€. κ·Έλμ var ν€μλ λμ let κ³Ό const ν€μλλ₯Ό μ¬μ©νλκ° λ³΄λ€.
첫λ²μ§Έλ μλ¬΄λ° λ¬Έμ κ° μλ μ½λμ΄λ€.
let age = 30
function showAge() {
console.log(age)
}
showAge()
ν¨μ showAge λ΄ age λΌλ λ³μλ μ§μ μ€μ½ν λ΄μμ μ°Έμ‘° ν μ μλ κ°μ΄ μμΌλ―λ‘ μ μ μ€μ½νμ μ μΈ λ° ν λΉλ age λ₯Ό μ°Έμ‘°ν μ μλ€. κ·Έλ¬λ―λ‘ ν¨μλ₯Ό μ€ννλ©΄ μ«μ 30 μ΄ μ°νκ² λ κ²μ΄λ€.
μ μ΄μ λλ²μ§Έλ‘ λ¬Έμ κ° λλ μ½λλ₯Ό μκ°νλ€.
let age = 30
function showAge() {
console.log(age)
let age = 20
}
showAge()
let μ hoisting μ΄ λμ§ μλλ€κ³ μκ°νκ² λλ€. νμ§λ§ μ΄λ μ¬μ€μ΄ μλλ€.
hoisting μ μ€μ½ν λ¨μλ‘ μΌμ΄λλλ° μμ μ½λ μ²λΌ curly bracket μ block μ€μ½ν λ΄μμ let μμλ hoisting μ΄ μΌμ΄λλλ°,
λ§μ½ let μ΄ hoisting μ΄ μΌμ΄λμ§ μλλ€λ©΄ age = 30 μ΄ μ°νμ΄μΌ ν κ²μ΄λ€.
let age = 30
function showAge() {
let age
console.log(age)
age = 20
}
let μμ block scope λ΄ νΈμ΄μ€ν μ΄ μΌμ΄λλ μ½λλ₯Ό μ λ¦¬ν΄ λ³΄μλ€.
μ μμ μ΄λ―Έ age κ° let μΌλ‘ μ μΈλμ΄ μλλ° λΈλ‘ μ€μ½ν λ΄μμ age κ° let μΌλ‘ μ¬μ μΈ λμ΄ μλ λͺ¨μ΅μ νμΈν μ μλ€.
μμ μλμ μ€λͺ νλ― let μ μ¬μ μΈμ΄ λΆκ°λ₯ νλ€κ³ νλ€.
λ³μλ 3λ¨κ³μ μμ± κ³Όμ μ κ±°μΉλ€.
var ν€μλλ,
μ¬κΈ°μ μ΄κΈ°νλ undefined λ₯Ό ν λΉν΄ μ£Όλ λ¨κ³λ₯Ό μλ―Ένλ€. κ·Έλμ μκΉ μ€λ₯λ₯Ό μΌμΌν€μ§ μκ³ undefined λ₯Ό μ½μμ μΆλ ₯ν΄ λ³΄μ¬μ€¬λ κ²μ΄λ€.
let ν€μλλ 맨 μμ²λΌ μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³κ° λΆλ¦¬ λμ΄μ μ§νλλ€.
μ΄κΈ°ν λ¨κ³λ μ€μ μ½λμ λλ¬νμ λ μ§νλκΈ° λλ¬Έμ Reference Error κ° μΌμ΄λλ€.
const ν€μλλ,
μ μΈ + μ΄κΈ°ν + ν λΉ μ΄ λμμ μ΄λ£¨μ΄μ§λ€. (κ·Έλ μ§ μμΌλ©΄ μλ¬κ° λ°μ) μλνλ©΄ let κ³Ό var μ κ°μ λ°κΏ μ μκΈ° (μ¬ν λΉ) λλ¬Έμ΄μ§λ§ const λ κ·Έλ μ§ μκΈ° λλ¬Έμ΄λ€.
let myname;
myname = 'mook'
var age;
age = 25
const gender
gender = 'male' // Error
const gender λΆλΆμμ μλ¬κ° λ°μνλ€. κ·Έ μ΄μ λ μ μΈνλ©΄μ λ°λ‘ ν λΉμ νμ§ μμκΈ° λλ¬Έμ΄λ€.
μ¦ μ μΈ + μ΄κΈ°ν + ν λΉ μ΄ λμμ μ΄λ£¨μ΄μ§μ§ μμκΈ° λλ¬Έμ΄λ€.
var λ ν¨μ μ€μ½νμ΄λ©°, let κ³Ό const ν€μλλ λΈλ‘ μ€μ½νλ₯Ό κ°μ§λ€.
(ν¨μ, ifλ¬Έ, forλ¬Έ, whileλ¬Έ, try/catch λ¬Έ λ±μ μλ―Έ)
λΈλ‘ μ€μ½νλ μ μΈλ curly bracket μ μ½λ λΈλ‘ λ΄μμλ§ λ³μκ° μ ν¨νλ©° μΈλΆμμ λΈλ‘ μ€μ½ν λ΄μ λ³μμ μ κ·Όν μ μλ€λ μλ―Έμ΄λ€.
μ¦ μ½λ λΈλ‘ λ΄λΆμμ μ μΈν λ³μλ μ§μ λ³μμ΄λ€.
var λ ν¨μ μ€μ½ν μ΄λ€.
const age = 30
if (age > 19) {
var txt = 'μ±μΈ'
}
console.log(txt) // 'μ±μΈ' μ΄ μ°νλ€.
μ΄μ²λΌ var λ κ°λ₯νμ§λ§ let κ³Ό const λ μ€κ΄νΈ λ΄λΆ μμμλ§ λ³μλ₯Ό μ¬μ©ν μ μλ€.
ν΄λΉ μ½λμ²λΌ μΈλΆμμ μ κ·Όμ΄ λΆκ°λ₯ νλ€λ λ»μ΄λ€.
var λν ν¨μ μ€μ½ν μ΄λ―λ‘,
function add(num1, num2) {
var result = num1 + num2
}
add(2, 3)
console.log(result)
Reference Error λ₯Ό μΌμΌν¨λ€. var λ ν¨μ λ΄μμλ§ λ³μ μ°Έμ‘°κ° κ°λ₯νκΈ° λλ¬Έμ΄λ€.
var κ° μ μΌνκ² λ²μ΄λ μ μλ μ€μ½νκ° ν¨μλΌκ³ μκ°νλ©΄ λλ€.
μμΈ‘ κ°λ₯ν κ²°κ³Όλ₯Ό λ΄κ³ λ²κ·Έλ₯Ό μ€μ΄κΈ° μν΄ let κ³Ό const μ¬μ©μ κΆμ₯νλ€.
μΆκ°λ‘ μ½μ λΈλ‘κ·Έ (μΊ‘ν΄νκ΅λ λΈλ‘κ·Έ - ν¨μμ μΈμ, ννμμ νΈμ΄μ€ν )
https://joshua1988.github.io/web-development/javascript/function-expressions-vs-declarations/