πŸ“ŒLanguage/JavaScript

[Deep Dive] var, let, const ν‚€μ›Œλ“œλ₯Ό νŒŒν—€μ³λ³΄μž

hellohailie 2022. 12. 7. 23:14

βœ”οΈ 이번 정독을 톡해 μ•Œκ²Œ 된 것
TDZ(temporal dead zone)μ΄λž€ λ¬΄μ—‡μΈκ°€μš”?
암묡적 전역이 λ¬΄μ—‡μΈκ°€μš”?

 

<λ‹΅ 미리보기>

πŸ€” TDZ(temporal dead zone)μ΄λž€ λ¬΄μ—‡μΈκ°€μš”?

πŸ€“ μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” μ‹œμž‘ μ§€μ κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ” ꡬ간을 λ§ν•©λ‹ˆλ‹€. 

 

πŸ€” 암묡적 전역이 λ¬΄μ—‡μΈκ°€μš”?

πŸ€“ μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— 값을 ν• λ‹Ήν•˜λ©΄ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ 되

 


βœ”οΈ var

β—† λ³€μˆ˜μ˜ 쀑볡 선언이 κ°€λŠ₯ν•΄μ„œ side effect λ°œμƒ κ°€λŠ₯μ„± ↑

β—† ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„(μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•œλ‹€. )이기 λ•Œλ¬Έμ— ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ½”λ“œλΈ”λ‘ λ‚΄μ—μ„œ 선언해도 λͺ¨λ‘ μ „μ—­ λ³€μˆ˜κ°€ λœλ‹€. side effect λ°œμƒ κ°€λŠ₯μ„± ↑

var i = 10;

for(var i = 0; i < 5; i++){
	console.log(i); // 0,1,2,3,4
}

console.log(i); // 5 (4κΉŒμ§€ μ½˜μ†”μ— 찍고 i++κ°€ 되고 μ‘°κ±΄μ‹μ—μ„œ falseκ°€ λ˜μ„œ for문이 μ’…λ£Œλ¨.)

β—† ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ λ³€μˆ˜ 선언문이 μŠ€μ½”ν”„μ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€. κ·Έλž˜μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°ν•  수 μžˆλ‹€. (단, ν• λ‹Ήλ¬Έ 이전에 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. )

 

원리λ₯Ό μ΄ν•΄ν•˜μž πŸ‘‰ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”κ°€ λ™μ‹œμ— μ§„ν–‰λœλ‹€. μ„ μ–Έ λ‹¨κ³„μ—μ„œ μŠ€μ½”ν”„(μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½)에 λ³€μˆ˜ μ‹λ³„μžλ₯Ό 등둝해 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 쑴재λ₯Ό μ•Œλ¦°λ‹€. 그리고 μ¦‰μ‹œ μ΄ˆκΈ°ν™” λ‹¨κ³„μ—μ„œ undefined둜 λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€. λ”°λΌμ„œ λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 λ³€μˆ˜μ— 접근해도 μŠ€μ½”ν”„μ— λ³€μˆ˜κ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šκ³  undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. 

 

 

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

(μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  λ•Œ windowλ₯Ό μƒλž΅ν•  수 μžˆλ‹€. )

// 이 μ˜ˆμ œλŠ” λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€. 

var x = 1;
y = 2; // 암묡적 μ „μ—­
function foo() {}

console.log(window.x); // 1
console.log(x); // 1

console.log(window.y); // 2
console.log(y); // 2

console.log(window.foo); // f foo() {}
console.log(foo); // f foo() {}

 

πŸ’‘var의 암묡적 μ „μ—­πŸ’‘

var x = 10; // μ „μ—­ λ³€μˆ˜

function foo () {
	y = 20; // window.y = 20;
}
foo();

console.log(x+y); // 30

πŸ‘‰ foo ν•¨μˆ˜ λ‚΄μ˜ yλŠ” μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ΄λ‹€. κ·Έλž˜μ„œ y = 20이 μ‹€ν–‰λ˜λ©΄ μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν• κ±°λΌκ³  μƒκ°ν–ˆλ‹€. ν•˜μ§€λ§Œ μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μž yλŠ” 마치 μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜μ²˜λŸΌ λ™μž‘ν•œλ‹€. μ™œλƒλ©΄ μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— 값을 ν• λ‹Ήν•˜λ©΄ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ 되기 λ•Œλ¬Έμ΄λ‹€..

yλŠ” 단지 μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‘œ μΆ”κ°€λ˜μ—ˆμ„ 뿐이라 λ³€μˆ˜κ°€ μ•„λ‹ˆλ‹€. κ·Έλž˜μ„œ ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€...! 

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ–΄λ©”μ΄μ§•ν•œ 문법이라고 μƒκ°ν•œλ‹€...


βœ”οΈ let 

β—† 쀑볡 μ„ μ–Έ κΈˆμ§€

β—† 블둝 레벨 μŠ€μ½”ν”„μ΄λ―€λ‘œ λͺ¨λ“  μ½”λ“œ 블둝(ν•¨μˆ˜, if λ¬Έ, forλ¬Έ, whileλ¬Έ, try/catch λ¬Έ λ“±) 을 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•œλ‹€. 

 

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

console.log(foo); // 1
console.log(bar); // μ°Έμ‘° μ—λŸ¬

 

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

μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” μ‹œμž‘ μ§€μ κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ” ꡬ간을 TDZ(temporal dead zone)이라고 ν•œλ‹€. 

 


βœ”οΈ const

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

const foo; // syntaxError

 

β—† let ν‚€μ›Œλ“œμ™€ 같이 블둝 레벨 μŠ€μ½”ν”„λ₯Ό 가진닀. 

 

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

 

β—† μƒμˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μœ μš©ν•˜κ²Œ 쓰인닀. μ™œλƒλ©΄ μœ μ§€λ³΄μˆ˜μ— μ’‹μ•„μ„œ!πŸ”₯ (λŒ€λ¬Έμžλ‘œ μ„ μ–Έν•΄μ„œ μƒμˆ˜μž„μ„ λͺ…ν™•ν•˜κ²Œ λ‚˜νƒ€λ‚΄μž!!)

 

β—† const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ— 객체λ₯Ό ν• λ‹Ήν•œ 경우 값을 λ³€κ²½ν•  수 μžˆλ‹€. (μž¬ν• λ‹Ή 없이 직접 변경이 κ°€λŠ₯ν•˜λ‹ˆκΉŒ)

const person = {
	name: 'Lee'
}

person.name = 'Kim';

console.log(person); // name: 'Kim'

 

 

πŸ‘©‍πŸ’» λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Diveλ₯Ό μ •λ…ν•˜κ³  μ œκ°€ μ΄ν•΄ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€ πŸ‘©‍πŸ’»