πŸ“‹ λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive | 23μž₯ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ (2)

waterglassesΒ·2022λ…„ 5μ›” 21일
0

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive λ„μ„œμ˜ 23μž₯을 μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

23.5 λ ‰μ‹œμ»¬ ν™˜κ²½

λ ‰μ‹œμ»¬ ν™˜κ²½

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μ‹λ³„μžμ™€ μ‹λ³„μžμ— 바인딩 된 κ°’, 그리고 μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κΈ°λ‘ν•˜λŠ” 자료ꡬ쑰둜 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ‹€.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” LexicalEnvironment μ»΄ν¬λ„ŒνŠΈμ™€ VariableEnvironment μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬μ„±λœλ‹€. μ—¬κΈ°μ„œ 이 두 μ»΄ν¬λ„ŒνŠΈλŠ” ν•˜λ‚˜μ˜ λ™μΌν•œ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μ°Έμ‘°ν•œλ‹€.

λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ ꡬ성 μ»΄ν¬λ„ŒνŠΈ
1. ν™˜κ²½ λ ˆμ½”λ“œ
μŠ€μ½”ν”„μ— ν¬ν•¨λœ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  λ“±λ‘λœ μ‹λ³„μžμ— 바인딩 된 값을 κ΄€λ¦¬ν•˜λŠ” μ €μž₯μ†Œλ‹€. ν™˜κ²½ λ ˆμ½”λ“œλŠ” μ†ŒμŠ€μ½”λ“œ νƒ€μž…μ— 따라 κ΄€λ¦¬ν•˜λŠ” λ‚΄μš©μ— 차이가 μžˆλ‹€.
2. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°
μƒμœ„ μŠ€μ½”ν”„λ₯Ό 가리킨닀. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½, 즉 ν•΄λ‹Ή μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œ μ†ŒμŠ€μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μƒμœ„ μ½”λ“œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ λ§ν•œλ‹€.

23.6 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성과 μ‹λ³„μž 검색 κ³Όμ •

23.6.1 μ „μ—­ 객체 생성

μ „μ—­ κ°μ²΄λŠ” μ „μ—­ μ½”λ“œκ°€ ν‰κ°€λ˜κΈ° 이전에 μƒμ„±λœλ‹€. μ „μ—­ 객체도 ν”„λ‘œν† νƒ€μž… 체인의 일원이닀.

// 23-05
window.toString();
window.__proto__.__proto__.proto__.__proto__ === Object.prototype; //true

23.6.2 μ „μ—­ μ½”λ“œ 평가

μ†ŒμŠ€μ½”λ“œκ°€ λ‘œλ“œ 되면 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ „μ—­ μ½”λ“œλ₯Ό ν‰κ°€ν•œλ‹€.

1. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성

λΉ„μ–΄μžˆλŠ” μ „μ—­ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜μ—¬ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ— ν‘Έμ‹œν•œλ‹€.

2. μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성

μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μƒμ„±ν•˜κ³  μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ°”μΈλ”©ν•œλ‹€.

2-1. μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œ 생성

μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œλŠ” 객체 ν™˜κ²½ λ ˆμ½”λ“œμ™€ 선언적 ν™˜κ²½ λ ˆμ½”λ“œλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

객체 ν™˜κ²½ λ ˆμ½”λ“œ : varν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ μ „μ—­ ν•¨μˆ˜, 빌트인 μ „μ—­ ν”„λ‘œνΌν‹°μ™€ 빌트인 μ „μ—­ ν•¨μˆ˜, ν‘œμ€€ 빌트인 객체λ₯Ό 관리
선언적 ν™˜κ²½ λ ˆμ½”λ“œ : let, constν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜ 관리

2-1-1. 객체 ν™˜κ²½ λ ˆμ½”λ“œ 생성

μ „μ—­ μ½”λ“œ ν‰κ°€μ—μ„œ varν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λœ μ „μ—­ ν•¨μˆ˜λŠ” μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ 객체 ν™˜κ²½ λ ˆμ½”λ“œμ— μ—°κ²°λœ BindingObjectλ₯Ό 톡해 μ „μ—­ 객체의 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œκ°€ λœλ‹€. μ΄λ•Œ λ“±λ‘λœ μ‹λ³„μžλ₯Ό μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ 객체 ν™˜κ²½ λ ˆμ½”λ“œμ—μ„œ κ²€μƒ‰ν•˜λ©΄ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ₯Ό κ²€μƒ‰ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

λ”°λΌμ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ½”λ“œ μ‹€ν–‰ λ‹¨κ³„μ—μ„œ λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에도 μ°Έμ‘°ν•  수 μžˆλ‹€. 단, λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°ν•œ λ³€μˆ˜μ˜ 값은 μ–Έμ œλ‚˜ undefined이닀.

ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜κ°€ ν‰κ°€λ˜λ©΄ 전역객체에 ν‚€λ‘œ λ“±λ‘ν•˜κ³  μƒμ„±λœ ν•¨μˆ˜ 객체λ₯Ό μ¦‰μ‹œ ν• λ‹Ήν•œλ‹€. μ—¬κΈ°μ„œ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚˜ ν•¨μˆ˜ μ„ μ–Έλ¬Έ 이전에 ν˜ΈμΆœν•  수 μžˆλ‹€.

2-1-2 선언적 ν™˜κ²½ λ ˆμ½”λ“œ 생성

let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” 선언적 ν™˜κ²½ λ ˆμ½”λ“œμ— λ“±λ‘λ˜κ³  κ΄€λ¦¬λœλ‹€.

2-2 this 바인딩

μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ [[GlobalThisValue]] λ‚΄λΆ€ μŠ¬λ‘―μ— thisκ°€ λ°”μΈλ”©λœλ‹€. μ „μ—­ μ½”λ“œμ—μ„œ thisλ₯Ό μ°Έμ‘°ν•˜λ©΄ μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ [[GlobalThisValue]] λ‚΄λΆ€ μŠ¬λ‘―μ— 바인딩 λ˜μ–΄μžˆλŠ” 객체가 λ°˜ν™˜λœλ‹€.

2.3 μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ •

μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λŠ” ν˜„μž¬ 평가 쀑인 μ†ŒμŠ€μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ μ†ŒμŠ€μ½”λ“œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½, 즉 μƒμœ„ μŠ€μ½”ν”„λ₯Ό 가리킨닀.

예제 23-04

var x = 1;
const y = 2;

function foo (a) {
  var x = 3;
  const y = 4;
  
  function bar (b) {
    const z = 5;
    console.log(a + b + x + y + z); 
  }
  bar(10);
}

foo(20);

23.6.4 μ „μ—­ μ½”λ“œ μ‹€ν–‰

μ „μ—­ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜κΈ° μ‹œμž‘ν•œλ‹€. λ³€μˆ˜ 할당문이 μ‹€ν–‰λ˜μ–΄ μ „μ—­ λ³€μˆ˜ x, y에 값이 ν• λ‹Ήλœλ‹€.

μ‹λ³„μž κ²°μ •
λ³€μˆ˜ ν• λ‹Ήλ¬Έ λ˜λŠ” ν•¨μˆ˜ ν˜ΈμΆœλ¬Έμ„ μ‹€ν–‰ν•˜λ €λ©΄ λ¨Όμ € λ³€μˆ˜ λ˜λŠ” ν•¨μˆ˜ 이름이 μ„ μ–Έλœ μ‹λ³„μžμΈμ§€ 확인해야 ν•œλ‹€. λ˜ν•œ μ‹λ³„μžλŠ” μŠ€μ½”ν”„κ°€ λ‹€λ₯΄λ©΄ 같은 이름을 κ°€μ§ˆ 수 있기 λ•Œλ¬Έμ— λ™μΌν•œ μ΄λ¦„μ˜ μ‹λ³„μžμΈ 경우 μ–΄λŠ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•˜λ©΄ λ˜λŠ”μ§€ κ²°μ •ν•  ν•„μš”κ°€ μžˆλ‹€. 이λ₯Ό μ‹λ³„μž 결정이라 ν•œλ‹€.
μ‹λ³„μžλ₯Ό 검색할 λ•ŒλŠ” 식행 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜κΈ° μ‹œμž‘ν•œλ‹€.

23.6.4 foo ν•¨μˆ˜ μ½”λ“œ 평가

foo ν•¨μˆ˜κ°€ 호좜되면 μ „μ—­ μ½”λ“œμ˜ 싀행을 μΌμ‹œ μ€‘λ‹¨ν•˜κ³  fooν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ½”λ“œμ˜ μ œμ–΄κΆŒμ΄ μ΄λ™ν•œλ‹€. 그리고 ν•¨μˆ˜ μ½”λ“œλ₯Ό ν‰κ°€ν•˜κΈ° μ‹œμž‘ν•œλ‹€.

1. ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성

foo ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€. μƒμ„±λœ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μ™„μ„±λœ λ‹€μŒ μ‹€ν–‰ μ»¨ν…ŒμŠ€νŠΈ μŠ€νƒμ— ν‘Έμ‹œλœλ‹€.

2. ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성

fooν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μƒμ„±ν•˜κ³  foo ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ°”μΈλ”©ν•œλ‹€.

2-1 ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œ 생성

ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œλŠ” λ§€κ°œλ³€μˆ˜, aruguments 객체, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ 지역 λ³€μˆ˜μ™€ 쀑첩 ν•¨μˆ˜λ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•œλ‹€.

2-2 this 바인딩

ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œμ˜ [[ThisValue]] λ‚΄λΆ€ μŠ¬λ‘―μ— thisκ°€ λ°”μΈλ”©λœλ‹€.

foo ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜λ‘œ ν˜ΈμΆœλ˜μ—ˆμœΌλ―ˆ thisλŠ” μ „μ—­ 객체λ₯Ό 가리킨닀. λ”°λΌμ„œ ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œμ˜ [[ThisValue]] λ‚΄λΆ€ μŠ¬λ‘―μ—λŠ” μ „μ—­ 객체가 λ°”μΈλ”©λœλ‹€.

2-3. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ •

μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰에 foo ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λœ μ‹œμ μ— μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°κ°€ ν• λ‹Ήλœλ‹€.

*λ ‰μ‹œμ»¬ μŠ€μ½”ν”„μ—μ„œ ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ”μ§€κ°€ μ•„λ‹ˆλΌ 어디에 μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€.

23.6.5 foo ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰

fooν•¨μˆ˜μ˜ μ†ŒμŠ€μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜κΈ° μ‹œμž‘ν•œλ‹€. λ§€κ°œλ³€μˆ˜μ— μΈμˆ˜κ°€ ν• λ‹Ήλ˜κ³ , λ³€μˆ˜ 할당문이 μ‹€ν–‰λ˜μ–΄ 지역 λ³€μˆ˜ x, y에 값이 ν• λ‹Ήλœλ‹€. 그리고 barκ°€ ν˜ΈμΆœλœλ‹€.

μ‹λ³„μž 결정을 μœ„ν•΄ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜κΈ° μ‹œμž‘ν•œλ‹€. ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€λŠ” foo ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ΄λ―€λ‘œ foo ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ μ‹λ³„μž x, yλ₯Ό κ²€μƒ‰ν•˜κΈ° μ‹œμž‘ν•œλ‹€.

23.6.6 bar ν•¨μˆ˜ μ½”λ“œ 평가

bar ν•¨μˆ˜κ°€ 호좜되면 bar ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ½”λ“œμ˜ μ œμ–΄κΆŒμ΄ μ΄λ™ν•œλ‹€. 그리고 bar ν•¨μˆ˜ μ½”λ“œλ₯Ό ν‰κ°€ν•˜κΈ° μ‹œμž‘ν•œλ‹€.

23.6.7 bar ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰

λ§€κ°œλ³€μˆ˜μ— μΈμˆ˜κ°€ ν• λ‹Ήλ˜κ³ , λ³€μˆ˜ 할당문이 μ‹€ν–‰λ˜μ–΄ 지역 λ³€μˆ˜ z에 값이 ν• λ‹Ήλœλ‹€. 그리고 console.logκ°€ μ‹€ν–‰λœλ‹€.

1. console μ‹λ³„μž 검색

console μ‹λ³„μžλ₯Ό μŠ€μ½”ν”„ μ²΄μΈμ—μ„œ 검색
: bar ν•¨μˆ˜ => foo ν•¨μˆ˜ => μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½

2. log λ©”μ„œλ“œ 검색

console κ°μ²΄μ—μ„œ log λ©”μ„œλ“œλ₯Ό 검색, μ΄λ•ŒλŠ” ν”„λ‘œν† νƒ€μž… 체인을 톡해 λ©”μ„œλ“œλ₯Ό κ²€μƒ‰ν•œλ‹€. log λ©”μ„œλ“œλŠ” μƒμ†λœ ν”„λ‘œνΌν‹°λΌ μ•„λ‹ˆλΌ console 객체가 직접 μ†Œμœ ν•˜λŠ” ν”„λ‘œνΌν‹°λ‹€.

3. ν‘œν˜„μ‹ a + b + x + y + z 의 평가

a, b, x, y, z μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•œλ‹€.

4. console.log λ©”μ„œλ“œ 호좜

μƒμ„±λœ 값을 console.log λ©”μ„œλ“œμ— μ „λ‹¬ν•˜μ—¬ ν˜ΈμΆœν•œλ‹€.

23.6.8 bar ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰ μ’…λ£Œ

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ bar μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 제거되고 foo μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ‹€ν–‰ 쀑이 λœλ‹€. λ‹€λ§Œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ œκ±°λ˜μ—ˆλ‹€κ³  λ ‰μ‹œμ»¬ ν™˜κ²½κΉŒμ§€ μ†Œλ©Έλ˜λŠ” 것은 μ•„λ‹ˆλ‹€.

23.6.9 foo ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰ μ’…λ£Œ

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ foo μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 제거되고 μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ‹€ν–‰ 쀑이 λœλ‹€.

23.6.10 μ „μ—­ μ½”λ“œ μ‹€ν–‰ μ’…λ£Œ

λŠλ‚€μ 

전체적인 μ½”λ“œ μ‹€ν–‰ 흐름을 μ•Œκ²Œλ˜μ—ˆλ‹€. μš°μ„  console μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•œλ‹€λŠ” 것도 처음 μΈμ§€ν•˜κ²Œ λ˜μ—ˆλ‹€. μ½”λ“œκ°€ μ–΄λ–€ ν˜•μ‹μœΌλ‘œ ν‰κ°€λ˜κ³  μ‹€ν–‰λ˜λŠ”μ§€ μ„€λͺ…을 λ”°λΌκ°€λ‹€λ³΄λ‹ˆ 쏙쏙 μ΄ν•΄λ˜μ—ˆλ‹€.

Ref

  • 이웅λͺ¨ μ €, ⌜λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive⌟, μœ„ν‚€λΆμŠ€
profile
맀 μˆœκ°„ μ„±μž₯ν•˜λŠ” κ°œλ°œμžκ°€ 되렀고 λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€