πŸ‘¨β€πŸ’»

JavaScript μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

2021-06-19   |   개발 JavaScript

post-img

이 λΈ”λ‘œκ·Έ μ½˜ν…μΈ μ—λŠ” μ±… 'μ½”μ–΄ μžλ°”μŠ€ν¬λ¦½νŠΈ'λ₯Ό 읽고 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 깊게 μ΄ν•΄ν•˜λŠ” λ‚΄μš©μ΄ λ‹΄κΉλ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ν•  μ½”λ“œμ— μ œκ³΅ν•  ν™˜κ²½ 정보λ₯Ό λͺ¨μ•„놓은 객체닀. μ–΄λ–€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ ν™œμ„±ν™”λ˜λŠ” μ‹œμ μ— μ–΄λ–€ λ³€μˆ˜κ°€ λŒμ–΄μ˜¬λ €μ§€κ³ , μ™ΈλΆ€ ν™˜κ²½ 정보λ₯Ό μ„€μ •ν•˜κ³ , this 값을 μ„€μ •ν•˜λŠ” λ“±μ˜ λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.

동일 ν™˜κ²½μ— μžˆλŠ” μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ ν•„μš”ν•œ ν™˜κ²½ 정보λ₯Ό λͺ¨λ‘ λͺ¨μ•„ μ»¨ν…μŠ€νŠΈλ‘œ κ΅¬μ„±ν•˜κ³ , 이λ₯Ό 콜 μŠ€νƒμ— μŒ“μ•„μ˜¬λ¦°λ‹€. μ—¬κΈ°μ„œ μŠ€νƒμ€ 자료ꡬ쑰의 'κ·Έ' μŠ€νƒμ΄ λ§žλ‹€. κ°€μž₯ μœ„μ— μŒ“μ€ μ»¨νƒμŠ€νŠΈμ™€ κ΄€λ ¨μžˆλŠ” μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μ‹μœΌλ‘œ 전체 μ½”λ“œμ˜ ν™˜κ²½κ³Ό μˆœμ„œλ₯Ό μ •ν•œλ‹€.

ν•˜λ‚˜μ˜ λ™μΌν•œ ν™˜κ²½, ν•˜λ‚˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό ꡬ성할 수 μžˆλŠ” 방법은 λ‹€μ–‘ν•˜κ²Œ μžˆλ‹€. μ „μ—­κ³΅κ°„μ—μ„œμ˜ μž‘μ—…, eval() ν•¨μˆ˜μ˜ ν™œμš©, κ°€μž₯ ν”ν•œ 방법은 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” 것이닀.



μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ˜ κΈ°λ³Έ λ™μž‘

// -- (1) var a = 1; function outer() { function inner() { console.log(a); // undefined var a = 3; } inner(); // -- (2) console.log(a); // 1 } outer(); // -- (3) console.log(a); // 1

μœ„μ˜ μ½”λ“œμ—μ„œ (1)의 ν™˜κ²½μ€ μ „μ—­ μ»¨ν…μŠ€νŠΈλ‹€. μ½”λ“œκ°€ μ½νžˆλŠ” μˆœκ°„ κ°€μž₯ λ¨Όμ € 콜 μŠ€νƒμ— λ‹΄κΈ΄λ‹€. μ „μ—­ μ»¨ν…μŠ€νŠΈλŠ” λ³„λ„μ˜ μ‹€ν–‰ λͺ…λ Ή 없이도 λΈŒλΌμš°μ €μ—μ„œ μžλ™μœΌλ‘œ μ‹€ν–‰ν•˜λŠ” μ»¨ν…μŠ€νŠΈλ‹€. 말 κ·ΈλŒ€λ‘œ 파일이 λΈŒλΌμš°μ €μ—μ„œ μ—΄λ¦¬λŠ” μˆœκ°„ 전역이 νŽΌμ³μ§€λŠ” 것이닀.

μ „μ—­μ μœΌλ‘œ μ½”λ“œλ“€μ„ λ‹΄λ‹€κ°€, (3)μ—μ„œ ν•¨μˆ˜ ν˜ΈμΆœμ„ λ§Œλ‚˜λ©΄ outer ν•¨μˆ˜μ— λŒ€ν•œ ν™˜κ²½ 정보듀을 μ»¨ν…μŠ€νŠΈλ‘œ μƒμ„±ν•˜μ—¬ 콜 μŠ€νƒμ— λ‹΄λŠ”λ‹€. outer() ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 콜 μŠ€νƒμ— λ‹΄λŠ” 것이닀. 이제 μ „μ—­μ—μ„œ μ‹œν–‰ν•˜λŠ” 것을 λ©ˆμΆ”κ³  outer ν•¨μˆ˜ λ‚΄λΆ€μ˜ μ½”λ“œλ“€μ„ 순차적으둜 μ‹€ν–‰μ‹œν‚¨λ‹€.

outer() ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ inner() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” (2)번 ν™˜κ²½μ΄ 있기 λ•Œλ¬Έμ— 콜 μŠ€νƒμ€ ν•΄λ‹Ή inner ν•¨μˆ˜μ˜ ν™˜κ²½μ„ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ‘œ λ‹΄λŠ”λ‹€. μŠ€νƒμ˜ νŠΉμ„±μƒ κ°€μž₯ 뒀에 λ“€μ–΄μ˜¨ μš”μ†Œλ₯Ό κ°€μž₯ λ¨Όμ € μ²˜λ¦¬ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— innerκ°€ 처리되고, outer, λ‹€μ‹œ μ „μ—­ μˆœμ„œλ‘œ μ§„ν–‰ν•œλ‹€.

ν•˜λ‚˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 콜 μŠ€νƒμ˜ κ°€μž₯ μœ„μ— μŒ“μ΄λŠ” μˆœκ°„μ΄ 곧 ν˜„μž¬ μ‹€ν–‰ν•  μ½”λ“œμ— κ΄€μ—¬ν•˜κ²Œ λ˜λŠ” μ‹œμ μ΄λ‹€. μƒˆλ‘œμš΄ μŠ€νƒμœΌλ‘œ νŠΉμ • μ»¨ν…μŠ€νŠΈκ°€ ν™œμ„±ν™”λ˜λ©΄ ν•΄λ‹Ή μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것에 ν•„μš”ν•œ ν™˜κ²½ 정보λ₯Ό μˆ˜μ§‘ν•œ 객체가 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μ €μž₯λ˜λŠ” 방식이 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μž‘ 방식이닀.



μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 객체 μ—˜λ¦¬λ¨ΌνŠΈ

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ κ°μ²΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ½”λ“œλ₯Ό λŒλ¦¬λŠ” λͺ©μ μœΌλ‘œ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— μš°λ¦¬κ°€ μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ 직접 ν™•μΈν•˜κΈ°λŠ” νž˜λ“€λ‹€.


Variable Environment (λ³€μˆ˜ ν™˜κ²½)

ν˜„μž¬ μ»¨νƒμŠ€νŠΈκ°€ 가지고 μžˆλŠ” μ‹λ³„μžμ— λŒ€ν•œ 정보, μ™ΈλΆ€ ν™˜κ²½ 정보, μ„ μ–Έ μ‹œμ μ˜ Lexical ν™˜κ²½μ˜ μŠ€λƒ…μƒ·μ„ κ°€μ§€λŠ” ν™˜κ²½μ΄λ‹€. ν•΄λ‹Ή μ»¨ν…μŠ€νŠΈκ°€ 졜초둜 싀행될 λ•Œμ˜ μŠ€λƒ…μƒ·μ„ μœ μ§€ν•œλ‹€. 이 μŠ€λƒ…μƒ·μ„ κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•΄μ„œ Lexical ν™˜κ²½μ„ λ§Œλ“ λ‹€. μ‹€ν•΅ μ»¨ν…μŠ€νŠΈμ˜ ν…œν”Œλ¦Ώμ„ λ§Œλ“œλŠ” 격이라고 μƒκ°ν•˜λ©΄ νŽΈν•˜κ² λ‹€.


Lexical Environment (사전적 ν™˜κ²½)

처음 선언될 λ•Œμ—λŠ” Variable ν™˜κ²½κ³Ό λ™μΌν•˜μ§€λ§Œ 변경사항이 생기면 μ‹€μ‹œκ°„μœΌλ‘œ λ°˜μ˜λ˜λŠ” ν™˜κ²½μ΄λ‹€. "ν˜„μž¬ μ»¨ν…μŠ€νŠΈμ—λŠ” μ–΄λ–€ μ–΄λ–€ μ‹λ³„μžλ“€μ΄ 있고, μ™ΈλΆ€ ν™˜κ²½μ— λŒ€ν•œ μ •λ³΄λŠ” νŠΉμ • μ–΄λ–€ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜λ„λ‘ λ˜μ–΄μžˆλ‹€." 이런 ν˜•μ‹μœΌλ‘œ μ‚¬μ „μ²˜λŸΌ μ •μ˜λœ ν™˜κ²½μ΄λ‹€.

environmentRecord

environmentRecordμ—λŠ” ν˜„μž¬ μ»¨ν…μŠ€νŠΈμ™€ κ΄€λ ¨λœ μ½”λ“œ μ‹λ³„μž 정보가 μ €μž₯λœλ‹€. ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ 이름, ν•¨μˆ˜ κ·Έ 자체, μ„ μ–Έλœ λ³€μˆ˜κ°€ μ»¨ν…μŠ€νŠΈμ˜ μ‹λ³„μžκ°€ λœλ‹€. μ½”λ“œ μœ„μ—μ„œ μ•„λž˜λ‘œ ν›‘μœΌλ©° μˆœμ„œλŒ€λ‘œ μˆ˜μ§‘ν•œλ‹€.

μˆ˜μ§‘λœ μ‹λ³„μžλ“€μ€ ν˜Έμ΄μŠ€νŒ…μ„ ν†΅ν•΄μ„œ, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ‹€μ§ˆμ μœΌλ‘œ μ‹λ³„μžλ“€μ„ μ‹€ν–‰μ˜ κ°€μž₯ μƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ¦¬μ§€λŠ” μ•Šμ§€λ§Œ, μ½”λ“œ ν•΄μ„μ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ €μ§„λ‹€.



ν˜Έμ΄μŠ€νŒ… (hoisting = hoist + ing) κ·œμΉ™

  • νŠΉμ • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λŒ€ν•΄μ„œ λ³€μˆ˜λŠ” μ„ μ–Έλ§Œ λŒμ–΄μ˜¬λ¦°λ‹€. 할당은 λŒμ–΄μ˜¬λ¦¬μ§€ μ•ŠλŠ”λ‹€. λ§€κ°œλ³€μˆ˜λ‘œ λ“€μ–΄μ˜€λŠ” 값도 λ™μΌν•˜λ‹€.
  • ν•¨μˆ˜μ— λŒ€ν•œ 선언은 ν•¨μˆ˜ 전체λ₯Ό λŒμ–΄μ˜¬λ¦°λ‹€. 동일 λ³€μˆ˜λͺ…μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ ν•΄λ‹Ή λ³€μˆ˜λͺ…μ˜ μ£Όμ†Œκ°’μ— ν•¨μˆ˜λ§Œ 담겨 λŒμ–΄μ˜¬λ €μ§„λ‹€κ³  μƒκ°ν•˜μž. λ‹€λ§Œ, ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±λœ ν•¨μˆ˜λŠ” λŒμ–΄μ˜¬λ €μ§€μ§€ μ•ŠλŠ”λ‹€. ν• λ‹Ήμ˜ κ°œλ…μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

ν•¨μˆ˜ μ„ μ–Έκ³Ό ν‘œν˜„μ‹

ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 방법은 μ•„λž˜μ˜ 3가지 방식을 λ”°λ₯Έλ‹€. μ„ μ–Έμ‹μ˜ 경우 보톡 function ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•˜λŠ” λΆ€λΆ„λ§Œ μ‘΄μž¬ν•˜κ³  λ³„λ„μ˜ ν• λ‹Ή 과정이 μ—†λ‹€. ν•¨μˆ˜ μ„ μ–Έμ‹μ˜ κ²½μš°μ—λŠ” λ°˜λ“œμ‹œ ν•¨μˆ˜λͺ…이 μ •μ˜λ˜μ–΄μ•Ό ν•œλ‹€.

이와 λ°˜λŒ€λ‘œ ν•¨μˆ˜ ν‘œν˜„μ‹μ€ μ •μ˜ν•œ ν•¨μˆ˜λ₯Ό 별도 λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” κ³Όμ • 자체λ₯Ό μ˜λ―Έν•œλ‹€. ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±λœ ν•¨μˆ˜λŠ” λ³„λ„μ˜ 이름이 κΌ­ μ‘΄μž¬ν•˜μ§€λŠ” μ•Šμ•„λ„ λœλ‹€. 읡λͺ…ν•¨μˆ˜λΌκ³ λ„ ν•œλ‹€.

function a() {} // ν•¨μˆ˜ 선언식 const b = function () {}; // ν•¨μˆ˜ ν‘œν˜„μ‹ -> function ν‚€μ›Œλ“œ const d = function e() {}; // 이름이 μžˆλŠ” ν•¨μˆ˜ ν‘œν˜„μ‹ -> μ™ΈλΆ€μ—μ„œ ν•΄λ‹Ή ν•¨μˆ˜λͺ…μœΌλ‘œ 호좜 λΆˆκ°€ e(); // -> error const c = () => {}; // ν•¨μˆ˜ ν‘œν˜„μ‹ -> arrow function



μŠ€μ½”ν”„

μŠ€μ½”ν”„λŠ” μ‹λ³„μž, λ³€μˆ˜κ°€ μ ‘κ·Ό κ°€λŠ₯ν•œ μœ νš¨λ²”μœ„λ‹€. ES6λΆ€ν„° μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜, 블둝에 λŒ€ν•œ μŠ€μ½”ν”„κ°€ κ΅¬λΆ„λ˜μ—ˆλ‹€. μ‹λ³„μžμ˜ μœ νš¨λ²”μœ„κ°€ μ•ˆμ—μ„œλΆ€ν„° λ°”κΉ₯으둜 μˆœμ„œλŒ€λ‘œ κ²€μƒ‰ν•˜λŠ” 체인을 'μŠ€μ½”ν”„ 체인'이라고 ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μŠ€μ½”ν”„λŠ” μ€‘κ΄„ν˜Έλ‘œ κ΅¬λΆ„ν•œλ‹€. λ˜ν•œ ν•¨μˆ˜μ˜ 내뢀에 μ‹λ³„μžκ°€ μžˆλŠ”μ§€ 외뢀에 μžˆλŠ”μ§€λ„ μŠ€μ½”ν”„λ₯Ό λ”°μ§€λŠ” 것에 큰 영ν–₯을 μ€€λ‹€.

μŠ€μ½”ν”„μ˜ κ·œμΉ™μ„ μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • 내뢀에 μžˆλŠ” μŠ€μ½”ν”„μ—μ„œ μ™ΈλΆ€μ˜ μŠ€μ½”ν”„λ‘œμ˜ 접근은 κ°€λŠ₯ν•˜λ‹€. 즉, λ‚΄λΆ€ μŠ€μ½”ν”„μ—μ„œ 외뢀에 μ •μ˜λœ λ³€μˆ˜λ₯Ό μ‘°νšŒν•  수 있고, μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ™ΈλΆ€ μŠ€μ½”ν”„μ—μ„œλŠ” 내뢀에 μ •μ˜λœ μ‹λ³„μžλ₯Ό μ‘°νšŒν•  수 μ—†λ‹€. 이것을 ν†΅ν•΄μ„œ μš°λ¦¬λŠ” λ³€μˆ˜μ˜ 은닉화λ₯Ό ν•  수 μžˆλ‹€.
  • μŠ€μ½”ν”„λŠ” 쀑첩이 κ°€λŠ₯ν•˜λ‹€. μ€‘μ²©λœ κ°€μž₯ μ™ΈλΆ€μ˜ μŠ€μ½”ν”„λ₯Ό μ „μ—­(global), 그것이 μ•„λ‹Œ μŠ€μ½”ν”„λŠ” λͺ¨λ‘ 지역(local) μŠ€μ½”ν”„λ‹€.
  • 지역 μŠ€μ½”ν”„ λ‚΄μ—μ„œ μ„ μ–Έλœ μ‹λ³„μž, λ³€μˆ˜κ°€ Lexical ν™˜κ²½μ—μ„œ 쑰회되기 λ•Œλ¬Έμ— μš°μ„ μˆœμœ„λ₯Ό 가진닀. Lexicalν•œ ν™˜κ²½μ—μ„œ μ„ μ–Έλœ μ‹λ³„μžκ°€ μ—†λ‹€λ©΄ κ·Έ λ‹€μŒ μŠ€μ½”ν”„λ₯Ό 뒀지고 또 λ‹€μŒ μŠ€μ½”ν”„λ₯Ό λ’€μ§€λŠ” ν˜•μ‹μœΌλ‘œ κ°€λŠ” 것이닀.

λͺ©μ°¨

μ΄μ–΄μ§€λŠ” κΈ€,