[πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λ”₯λ‹€μ΄λΈŒ] 15μž₯. let, const ν‚€μ›Œλ“œμ™€ 블둝 레벨 μŠ€μ½”ν”„

λ…Έμ˜μ™„Β·2023λ…„ 10μ›” 24일
0

JavaScript(Deep Dive)

λͺ©λ‘ 보기
10/23
post-thumbnail

let, const ν‚€μ›Œλ“œμ™€ 블둝 레벨 μŠ€μ½”ν”„

1. var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ˜ 문제점

1-1. λ³€μˆ˜ 쀑볡 μ„ μ–Έ ν—ˆμš©

var x = 1;
var y = 1;

// var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언을 ν—ˆμš©ν•œλ‹€.
// μ΄ˆκΈ°ν™”λ¬Έμ΄ μžˆλŠ” λ³€μˆ˜ 선언문은 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ var ν‚€μ›Œλ“œκ°€ μ—†λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.
var x = 100;
// μ΄ˆκΈ°ν™”λ¬Έμ΄ μ—†λŠ” λ³€μˆ˜ 선언문은 λ¬΄μ‹œλœλ‹€.
var y;

console.log(x); // 100
consoel.log(y); // 1

1-2. ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ 인정 λ”°λΌμ„œ, ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ½”λ“œ 블둝 λ‚΄μ—μ„œ 선언해도 λͺ¨λ‘ μ „μ—­ λ³€μˆ˜κ°€ λœλ‹€.

1-3. λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

var ν‚€μ›Œλ“œλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ λ³€μˆ˜ 선언문이 μŠ€μ½”ν”„μ΄ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ 것 처럼 λ™μž‘ 즉, λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°ν•  수 μžˆλ‹€. 단 ν• λ‹Ήλ¬Έ 이전에 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ μ–Έμ œλ‚˜ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.

// 이 μ‹œμ μ—λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ 이미 foo λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλ‹€(1.선언단계)
// λ³€μˆ˜ fooλŠ” undefined둜 μ΄ˆκΈ°ν™”λœλ‹€.(2. μ΄ˆκΈ°ν™” 단계)
console.log(foo) // undefined

// λ³€μˆ˜μ— 값을 ν• λ‹Ή(3. ν• λ‹Ή 단계)
foo = 123;
console.log(foo); // 123

// λ³€μˆ˜ 선언은 λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ μ‹€ν–‰λœλ‹€.
var foo;
  • λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” 것은 λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€μ§€λŠ” μ•Šμ§€λ§Œ ν”„λ‘œκ·Έλž¨μ˜ 흐름상 λ§žμ§€ μ•Šμ„λΏλ”λŸ¬ 가독성을 λ–¨μ–΄λœ¨λ¦¬κ³  였λ₯˜λ₯Ό λ°œμƒμ‹œν‚¬ 여지λ₯Ό 남긴닀.

2. let ν‚€μ›Œλ“œ

2-1. λ³€μˆ˜ 쀑볡 μ„ μ–Έ κΈˆμ§€

var foo = 123;
// var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„λ‚΄μ—μ„œ 쀑볡 선언을 ν—ˆμš©ν•œλ‹€.
// μ•„λž˜ λ³€μˆ˜ 선언문은 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ var ν‚€μ›Œλ“œκ°€ μ—†λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.

var foo = 456;
let bar = 123;
// let μ΄λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡선언을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
let bar = 456; // SyntaxError: Identifier 'bar' has already been declared

2-2. 블둝 레벨 μŠ€μ½”ν”„

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λͺ¨λ“  μ½”λ“œ 블둝(ν•¨μˆ˜, if λ¬Έ, for λ¬Έ, while λ¬Έ, try/ catch λ¬Έ λ“±)을 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•˜λŠ” 블둝 레벨 μŠ€μ½”ν”„λ₯Ό λ”°λ₯Έλ‹€

let foo = 1; // μ „μ—­ λ³€μˆ˜

{
	let foo = 2; // 지역 λ³€μˆ˜
	let bar = 3; // 지역 λ³€μˆ˜
}

console.log(foo); // 1
console.log(bar); // ReferenceError : bar is not defined

2-3. λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ™€ 달리 let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것 처럼 λ™μž‘

console.log(foo); // ReferenceError: foo is not defined
let foo;
// let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λ₯Ό λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°ν•˜λ©΄ μ°Έμ‘° μ—λŸ¬ λ°œμƒ.

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 ν•œλ²ˆμ— 진행. 즉, μ„ μ–Έ λ‹¨κ³„μ—μ„œ μŠ€μ½”ν”„(μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½)에 λ³€μˆ˜ μ‹λ³„μžλ₯Ό 등둝해 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 λ³€μˆ˜μ˜ 쑴재λ₯Ό μ•Œλ¦°λ‹€.

// var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λŸ°νƒ€μž„ 이전에 μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 μ‹€ν–‰λœλ‹€.
// λ‹€λΌμ„œ λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  숭 γ…£γ…†λ‹€.
console.log(foo); // undefined

var foo;
console.log(foo); // undefined

foo = 1; // ν• λ‹Ήλ¬Έμ—μ„œ ν• λ‹Ή 단계가 μ‹€ν–‰.
console.log(foo) // 1;

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λΆ„λ¦¬λ˜μ–΄ 진행. 즉, λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ 선언단계가 λ¨Όμ € μ‹€ν–‰λ˜μ§€λ§Œ μ΄ˆκΈ°ν™” λ‹¨κ³„λŠ” λ³€μˆ˜ 선언문에 λ„λ‹¬ν–ˆμ„ λ•Œ μ‹€ν–‰λœλ‹€.

μ΄ˆκΈ°ν™” 단계 μ‹€ν–‰λ˜κΈ° 이전에 λ³€μˆ˜μ— μ ‘κ·Όν•˜λ €κ³  ν•˜λ©΄ μ°Έμ‘° μ—λŸ¬ λ°œμƒ. letν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점 λΆ€ν„° μ΄ˆκΈ°ν™” 단계 μ‹œμž‘ 지점(λ³€μˆ˜ μ„ μ–Έλ¬Έ)κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€. μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” μ‹œμž‘μ§€μ  κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ” ꡬ간을 μΌμ‹œμ  μ‚¬κ°μ§€λŒ€λΌκ³  λΆ€λ₯Έλ‹€.

// λŸ°νƒ€μž„ 이전에 μ„ μ–Έ 단계가 μ‹€ν–‰λœλ‹€. 아직 λ³€μˆ˜κ°€ μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ•˜λ‹€.
// μ΄ˆκΈ°ν™” μ΄μ „μ˜ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€μ—μ„œλŠ” λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€.
console.log(foo); // ReferenceError: foo is not defined

let foo; // λ³€μˆ˜ μ„ μ–Έλ¬Έμ—μ„œ 초기회 단계가 μ‹€ν–‰λœλ‹€.
console.log(foo); // undefined

foo = 1; // ν• λ‹Ήλ¬Έμ—μ„œ ν• λ‹Ή 단계가 μ‹€ν–‰.
console.log(foo); // 1

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ 보인닀. ν•˜μ§€λ§Œ 그렇지 μ•Šλ‹€

let foo = 1; // μ „μ—­ λ³€μˆ˜
{
	console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
	let foo = 2; // 지역 λ³€μˆ˜
}
// let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ˜ 경우 λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 
// μ „μ—­ λ³€μˆ˜ foo의 값을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.
// ν˜Έμ΄μŠ€νŒ… λ°œμƒ ν•΄λ‹Ή μŠ€μ½”ν”„μ— μ΅œμƒλ‹¨μ— λŒμ–΄ μ˜¬λ €μ§„ 것 같은 ν˜„μƒ λ°œμƒ.
// μ „μ—­ λ³€μˆ˜ foo μ°Έμ‘° λΆˆκ°€λŠ₯.

πŸ’‘ ν˜Έμ΄μŠ€νŒ…μ΄λž€?

ν˜Έμ΄μŠ€νŒ…μ€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μ „ λ³€μˆ˜μ„ μ–Έ/ν•¨μˆ˜μ„ μ–Έμ„ ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” 것이 μ•„λ‹ˆλ‹€.

ν˜Έμ΄μŠ€νŒ…μ€ μ½”λ“œκ°€ μ‹€ν–‰ν•˜κΈ° μ „ λ³€μˆ˜μ„ μ–Έ/ν•¨μˆ˜μ„ μ–Έμ΄ ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄ μ˜¬λ €μ§„ 것 같은 ν˜„μƒμ„ λ§ν•œλ‹€.

μ „μ—­ 객체와 let

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ μ „μ—­ ν•¨μˆ˜, 그리고 μ„ μ–Έν•˜μ§€ μ•Šμ€ λ³€μˆ˜μ— 값을 ν• λ‹Ήν•œ 암묡적 전역은 μ „μ—­ 객체 window의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€.

let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ‹€. let μ „μ—­ λ³€μˆ˜λŠ” 보이지 μ•ŠλŠ” κ°œλ…μ μΈ 블둝내에 μ‘΄μž¬ν•˜κ²Œ λœλ‹€.

let x = 1;

// let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체 window의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ‹€.
console.log(window.x); // undefined
consoel.log(x); // 1

3. const ν‚€μ›Œλ“œ

  • const ν‚€μ›Œλ“œλŠ” μƒμˆ˜λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄ μ‚¬μš© ν•˜μ§€λ§Œ, λ°˜λ“œμ‹œ μƒμˆ˜λ§Œμ„ μœ„ν•΄ μ‚¬μš©ν•˜μ§€ μ•ŠμŒ.
  • const ν‚€μ›Œλ“œμ˜ νŠΉμ§•μ€ letν‚€μ›Œλ“œμ™€ λŒ€λΆ€λΆ„ 톡일 λ‹€λ₯Έμ  μ€‘μ‹¬μœΌλ‘œ μ•„λž˜ μ„€λͺ….

3-1. μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”

const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ°˜λ“œμ‹œ μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™” ν•΄μ•Όν•œλ‹€.

const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” letν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 블둝 레벨 μŠ€μ½”ν”„λ₯Ό 가지며, λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘.

{
  // λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것 처럼 λ™μž‘
  console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
  const foo = 1;
  console.log(foo); // 1
}

// 블둝 레벨 μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€.
console.log(foo); // ReferenceError: foo is not defined

3-2. μž¬ν• λ‹Ή κΈˆμ§€

var λ˜λŠ” let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ΄ μžμœ λ‘œμš°λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ΄ κΈˆμ§€

3-3. μƒμˆ˜

μƒμˆ˜λŠ” μž¬ν• λ‹Ήμ΄ κΈˆμ§€λœ λ³€μˆ˜λ₯Ό λ§ν•œλ‹€. μƒμˆ˜λŠ” μƒνƒœ μœ μ§€μ™€ 가독성, μœ μ§€λ³΄μˆ˜μ˜ 편의λ₯Ό μœ„ν•΄ 적극적으둜 μ‚¬μš©ν•΄μ•Όν•œλ‹€.

const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ— μ›μ‹œ 값을 ν• λ‹Ήν•œ 경우 μ›μ‹œ 값은 λ³€κ²½ν•  수 μ—†λŠ” 값이고, const ν‚€μ›Œλ“œμ— μ˜ν•΄ μž¬ν• λ‹Ήμ΄ κΈˆμ§€λ˜λ―€λ‘œ ν• λ‹Ήλœ 값을 λ³€κ²½ν•  수 μžˆλŠ” 방법은 μ—†λ‹€. μ›μ‹œκ°’ λ³€κ²½ 방법은 μž¬ν• λ‹Ή 밖에 μ—†λ‹€.

3-4. const ν‚€μ›Œλ“œμ™€ 객체

const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ— μ›μ‹œ κ°’ ν• λ‹Ήν•œ 경우 값을 λ³€κ²½ν•  수 μ—†μ§€λ§Œ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ— 객체λ₯Ό ν• λ‹Ήν•œ 경우 값을 λ³€κ²½ν•  수 μžˆλ‹€.

const ν‚€μ›Œλ“œλŠ” μž¬ν• λ‹Ήμ„ κΈˆμ§€ν•  뿐 "λΆˆλ³€"을 μ˜λ―Έν•˜μ§€ μ•ŠλŠ”λ‹€.

4. var vs. let vs. const

λ³€μˆ˜ μ„ μ–Έμ—λŠ” 기본적으둜 constλ₯Ό μ‚¬μš©ν•˜κ³  let은 μž¬ν• λ‹Ήμ΄ ν•„μš”ν•œ κ²½μš°μ— ν•œμ •ν•΄ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ˜λ„μΉ˜ μ•Šμ€ μž¬ν• λ‹Ήμ„ λ°©μ§€ν•˜κΈ° λ•Œλ¬Έμ— μ’€ 더 μ•ˆμ „ν•˜λ‹€.

var와 let const ν‚€μ›Œλ“œλŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©

  • ES6λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ var ν‚€μ›Œλ“œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μž¬ν• λ‹Ή ν•„μš”ν•œ κ²½μš°μ— ν•œμ •ν•΄ let ν‚€μ›Œλ“œλ₯Ό μ‚¬μš© μ΄λ•Œ λ³€μˆ˜μ˜ μŠ€μ½”ν”„λŠ” μ΅œλŒ€ν•œ 쒁게
  • 변경이 λ°œμƒν•˜μ§€ μ•Šκ³  읽기 μ „μš©μœΌλ‘œ μ‚¬μš©ν•˜λŠ”(μž¬ν• λ‹Ήμ΄ ν•„μš” μ—†λŠ” μƒμˆ˜) μ›μ‹œ κ°’κ³Ό κ°μ²΄μ—λŠ” const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. const ν‚€μ›Œλ“œλŠ” μž¬ν• λ‹Ήμ„ κΈˆμ§€ν•˜λ―€λ‘œ var, let ν‚€μ›Œλ“œ 보닀 μ•ˆμ „ν•˜λ‹€.

0개의 λŒ“κΈ€