Programming/JavaScript

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 14μž₯ μ „μ—­ λ³€μˆ˜μ˜ 문제점

yuri lee 2023. 6. 3. 16:39
λ°˜μ‘ν˜•

14.1 λ³€μˆ˜μ˜ 생λͺ…μ£ΌκΈ°


14.1.1 지역 λ³€μˆ˜μ˜ 생λͺ…μ£ΌκΈ°

지역 λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°λŠ” ν•¨μˆ˜μ˜ 생λͺ… 주기와 μΌμΉ˜ν•©λ‹ˆλ‹€. 

function foo() {
  var x = 'local' // λ³€μˆ˜ x 생성, λ³€μˆ˜ x에 κ°’ ν• λ‹Ή
  console.loog(x)
  return x // λ³€μˆ˜ μ†Œλ©Έ
}

foo();
console.log(x); // x is not defined

ν˜Έμ΄μŠ€νŒ…μ€ μŠ€μ½”ν”„λ₯Ό λ‹¨μœ„λ‘œ λ™μž‘ν•©λ‹ˆλ‹€. ν˜Έμ΄μŠ€νŒ…μ€ λ³€μˆ˜ 선언이 μŠ€μ½”ν”„μ΄ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” JS 고유의 νŠΉμ§•μ„ λ§ν•©λ‹ˆλ‹€. 

 

14.1.2 μ „μ—­ λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°

ν•¨μˆ˜μ™€ 달리 μ „μ—­ μ½”λ“œλŠ” λͺ…μ‹œμ μΈ 호좜 없이 μ‹€ν–‰λ©λ‹ˆλ‹€. var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λ©λ‹ˆλ‹€. μ΄λŠ” μ „μ—­ λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°κ°€ μ „μ—­ 객체의 생λͺ… 주기와 μΌμΉ˜ν•œλ‹€λŠ” 것을 λ§ν•©λ‹ˆλ‹€. 

 

μ „μ—­κ°œμ²΄ (golbal object)

μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 이전 단계에 JS엔진에 μ˜ν•΄ μ–΄λ–€ 객체보닀도 λ¨Όμ € μƒμ„±λ˜λŠ” νŠΉμˆ˜ν•œ κ°μ²΄μž…λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ(λΈŒλΌμš°μ €) ν™˜κ²½μ—μ„œλŠ” window, μ„œλ²„μ‚¬μ΄λ“œ(Node.js) ν™˜κ²½μ—μ„œλŠ” global 객체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 

 

λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ›ΉνŽ˜μ΄μ§€λ₯Ό 닫을 λ•ŒκΉŒμ§€ μœ νš¨ν•©λ‹ˆλ‹€. 즉 var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ˜ 생λͺ… 주기와 μΌμΉ˜ν•©λ‹ˆλ‹€. 

 

14.2 μ „μ—­ λ³€μˆ˜μ˜ 문제점


암묡적 κ²°ν•© (implicit coupling)

μ „μ—­ λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ μ˜λ„λŠ” μ „μ—­, 즉 μ½”λ“œ μ–΄λ””μ„œλ“  μ°Έμ‘°ν•˜κ³  ν• λ‹Ήν•  수 있기 λ•Œλ¬Έμ— 암묡적 결합을 ν—ˆμš©ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. 유효 λ²”μœ„κ°€ κΈΈλ©΄ μ½”λ“œ 가독성은 떨어지고, μ˜λ„μΉ˜ μ•Šκ²Œ μƒνƒœκ°€ 변경될 수 μžˆμŠ΅λ‹ˆλ‹€. 

 

κΈ΄ 생λͺ…μ£ΌκΈ° 

μ „μ—­λ³€μˆ˜λŠ” 생λͺ…μ£ΌκΈ°κ°€ κΉλ‹ˆλ‹€. 

 

μŠ€μ½”ν”„ 체인 μƒμ—μ„œ 쒅점에 쑴재

μ „μ—­ λ³€μˆ˜λŠ” μŠ€μ½”ν”„ 체인 상에 쒅점에 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μ „μ—­ λ³€μˆ˜μ˜ 검색 속도가 κ°€μž₯ λŠλ¦½λ‹ˆλ‹€. 

 

λ„€μž„νŽ˜μ΄μŠ€ μ˜€μ—Ό

파일이 λΆ„λ¦¬λ˜μ–΄ μžˆλ‹€ ν•˜λ”λΌλ„ ν•˜λ‚˜μ˜ μ „μ—­ μŠ€μ½”ν”„λ₯Ό κ³΅μœ ν•˜λ©΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ κ²°κ³Όλ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.


14.3 μ „μ—­ λ³€μˆ˜μ˜ μ‚¬μš©μ„ μ–΅μ œν•˜λŠ” 방법


μ „μ—­ λ³€μˆ˜λ₯Ό λ°˜λ“œμ‹œ μ‚¬μš©ν•΄μ•Ό ν•  이유λ₯Ό 찾지 λͺ»ν•œλ‹€λ©΄ 지역 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 

14.3.1 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— ν˜ΈμΆœλ˜λŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” ν•œλ²ˆλ§Œ ν˜ΈμΆœλ˜λ―€λ‘œ λͺ¨λ“  λ³€μˆ˜λŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜κ°€ λ•λ‹ˆλ‹€. 

(function () {
  var foo = 10;

}())

 

14.3.2 λ„€μž„μŠ€νŽ˜μ΄μŠ€ 객체

전역에 λ„€μž„μŠ€νŽ˜μ΄μŠ€ 역할을 λ‹΄λ‹Ήν•  객체λ₯Ό μƒμ„±ν•˜κ³  μ „μ—­ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©ν•˜κ³  싢은 λ³€μˆ˜λ₯Ό ν”„λ‘œνΌν‹°λ‘œ μΆ”κ°€ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 

 

14.3.3 λͺ¨λ“ˆ νŒ¨ν„΄

λͺ¨λ“ˆ νŒ¨ν„΄μ€ 클래슀λ₯Ό λͺ¨λ°©ν•΄μ„œ 관련이 μžˆλŠ” λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό λͺ¨μ•„ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ‘œ 감싸 ν•˜λ‚˜μ˜ λͺ¨λ“ˆμ„ λ§Œλ“­λ‹ˆλ‹€. 


14.3.4 ES6 λͺ¨λ“ˆ

ES6 λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄ λ”λŠ” μ „μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 파일 자체의 λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 

<script type="module" src="lib.mjs"></script>
<script type="module" src="app.mjs"></script>

 

Reference: λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive
λ°˜μ‘ν˜•