λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/Javascript & NodeJS

[Javascript] μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ (Execution Context) 와 μ†ŒμŠ€μ½”λ“œ

by vodkassi 2021. 9. 28.
728x90

이전에 Javascript μ—μ„œμ˜ this λ₯Ό λ‹€λ€˜λ˜ κΈ€μ—μ„œ 잠깐 "μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ"λ₯Ό μ–ΈκΈ‰ν–ˆμ—ˆλ‹€. Javascript μ—λŠ” (그리고 μ•„λ§ˆ λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—λŠ”) μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλΌλŠ” κ°œλ…μ΄ μ‘΄μž¬ν•˜λŠ”λ°, 이λ₯Ό 잘 μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” μš°μ„  "μ†ŒμŠ€μ½”λ“œ" 의 κ°œλ…λΆ€ν„° 이해해야 ν•œλ‹€. 

 

✨  μ†ŒμŠ€μ½”λ“œ 

ECMAScript λŠ” μ†ŒμŠ€μ½”λ“œλ₯Ό 4가지 νƒ€μž…μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. μ†ŒμŠ€μ½”λ“œλŠ” νƒ€μž…λ§ˆλ‹€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ” κ³Όμ •κ³Ό 관리 λ‚΄μš©μ΄ λ‹€λ₯΄λ©°, 이λ₯Ό κ°„λž΅νžˆ μš”μ–‘ν•œ λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™λ‹€. 

 

πŸ“ μ „μ—­ μ½”λ“œ (Global code)

: 전역에 μ‘΄μž¬ν•˜λŠ” μ½”λ“œ (ν•¨μˆ˜, 클래슀의 λ‚΄λΆ€ μ½”λ“œ 미포함)

1. μ „μ—­ μŠ€μ½”ν”„ (μ΅œμƒμœ„ μŠ€μ½”ν”„) 생성

2. μ „μ—­ 객체와 μ—°κ²°

3. var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜ + μ„ μ–Έλœ μ „μ—­ ν•¨μˆ˜λ₯Ό μ „μ—­ 객체의 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ‘œ 바인딩

 

πŸ“ ν•¨μˆ˜ μ½”λ“œ (Function code)

: ν•¨μˆ˜ 내뢀에 μ‘΄μž¬ν•˜λŠ” μ½”λ“œ (쀑첩 ν•¨μˆ˜, 클래슀의 λ‚΄λΆ€ μ½”λ“œ 미포함) 

1. 지역 μŠ€μ½”ν”„ 생성

2. 지역 μŠ€μ½”ν”„λ₯Ό μ „μ—­ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜λŠ” μŠ€μ½”ν”„ 체인의 μΌμ›μœΌλ‘œ μ—°κ²°

3. 지역 λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, arguments 객체 관리

 

πŸ“ Eval μ½”λ“œ (Eval code)

: Eval ν•¨μˆ˜ (빌트인 μ „μ—­ ν•¨μˆ˜) 의 인자둜 μ „λ‹¬λ˜μ–΄ μ‹€ν–‰λ˜λŠ” μ½”λ“œ

1. strict mode μ—μ„œ λ…μžμ μΈ μŠ€μ½”ν”„ 생성 

 

πŸ“ λͺ¨λ“ˆ μ½”λ“œ (Module code)

: λͺ¨λ“ˆ 내뢀에 μ‘΄μž¬ν•˜λŠ” μ½”λ“œ (ν•¨μˆ˜, 클래슀의 λ‚΄λΆ€ μ½”λ“œ 미포함)

1. 독립적인 λͺ¨λ“ˆ μŠ€μ½”ν”„ 생성 

 

μ†ŒμŠ€μ½”λ“œλ§ˆλ‹€ μžμ‹ μ˜ μŠ€μ½”ν”„λ₯Ό κ°€μž₯ λ¨Όμ € μƒμ„±ν•˜λŠ” 것을 확인할 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μŠ€μ½”ν”„μ˜ 생성을 μœ„ν•΄ μš°μ„  각 μ†ŒμŠ€μ½”λ“œκ°€ '평가'λ˜μ–΄μ•Ό ν•œλ‹€.

 

 

✨  μ†ŒμŠ€μ½”λ“œμ˜ 평가, μ‹€ν–‰

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ†ŒμŠ€μ½”λ“œλ₯Ό 평가와 μ‹€ν–‰μ˜ κ³Όμ •μœΌλ‘œ λ‚˜λˆ„μ–΄ μ²˜λ¦¬ν•œλ‹€. 

 

1. 평가 κ³Όμ •

- μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성

- λ³€μˆ˜, ν•¨μˆ˜ (μ„ μ–Έλ¬Έ) λ¨Όμ € μ‹€ν–‰

- μƒμ„±λœ μ‹λ³„μžλ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ— 등둝 

 

2. μ‹€ν–‰ κ³Όμ • 

- 평가 이후 μ†ŒμŠ€μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰ (μ„ μ–Έλ¬Έ μ œμ™Έ) === λŸ°νƒ€μž„ μ‹œμž‘ 

- μ†ŒμŠ€μ½”λ“œ 싀행에 ν•„μš”ν•œ μ •λ³΄λŠ” (λ³€μˆ˜ λ“±) μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ—μ„œ κ²€μƒ‰ν•΄μ„œ 취득 

- μ†ŒμŠ€μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³Ό (λ³€μˆ˜κ°’ λ³€κ²½ λ“±)λ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ— 등둝 

 

예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 μ½”λ“œκ°€ μžˆλ‹€κ³  ν•˜μž. 

 

var x;
x = 'hello';

 

1. μš°μ„ , JS 엔진은 μ†ŒμŠ€μ½”λ“œλ₯Ό ν‰κ°€ν•œλ‹€.

2. 평가 μ‹œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³ , 선언문인 var x; λ₯Ό μ‹€ν–‰ν•˜μ—¬ μ‹λ³„μž x λ₯Ό μŠ€μ½”ν”„μ— λ“±λ‘ν•œλ‹€.

3. μ΄λ•Œ x 의 값은 undefined 둜 μ΄ˆκΈ°ν™” λœλ‹€.

4. 이후, μ†ŒμŠ€μ½”λ“œλŠ” μ‹€ν–‰ 과정에 λ“€μ–΄κ°€λ©° 아직 μ‹€ν–‰λ˜μ§€ μ•Šμ€ ν• λ‹Ήλ¬Έ x = 'hello'; λ₯Ό μ‹€ν–‰ν•œλ‹€.

5. μ΄λ•Œ 엔진은 x 에 값을 ν• λ‹Ήν•˜κΈ° μœ„ν•΄ x κ°€ 이미 μŠ€μ½”ν”„μ— λ“±λ‘λ˜μ—ˆλŠ”μ§€ ν™•μΈν•œλ‹€.

6. x κ°€ 등둝 (μ„ μ–Έ) 된 λ³€μˆ˜λΌλ©΄, 할당을 μ§„ν–‰ν•˜λ©° κ·Έ κ²°κ³Όλ₯Ό 또 μŠ€μ½”ν”„μ— λ“±λ‘ν•œλ‹€. 

7. μ‹€ν–‰ κ²°κ³Ό, x 의 값은 'undefined' μ—μ„œ 'hello' 둜 바뀐닀. 

 

 

πŸ“ λ§Œμ•½ λ‹€μŒκ³Ό 같이 μ „μ—­ μ½”λ“œμ™€ ν•¨μˆ˜ μ½”λ“œλ‘œ κ΅¬μ„±λœ μ½”λ“œλΌλ©΄ μ–΄λ–¨κΉŒ? 

 

// κ°€. μ „μ—­λ³€μˆ˜ μ„ μ–Έ
const x = 1;

// λ‚˜. ν•¨μˆ˜ μ„ μ–Έλ¬Έ
function foo(y) {
    // λ‹€. μ§€μ—­λ³€μˆ˜ μ„ μ–Έ
    const x = 2;
    // 라. λ©”μ„œλ“œ 호좜
    console.log(x + y); // 102
}

// 마. ν•¨μˆ˜ 호좜
foo(100); 

// λ°”. λ©”μ„œλ“œ 호좜 
console.log(x + 100); // 101

 

μœ„ μ½”λ“œλŠ” λ‹¨κ³„λ³„λ‘œ 평가 & μ‹€ν–‰λœλ‹€. 

 

1. μ „μ—­ μ½”λ“œ 평가

- μ„ μ–Έλ¬Έ μ‹€ν–‰ (κ°€, λ‚˜) & μ „μ—­ μŠ€μ½”ν”„μ— 등둝

 

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

- λŸ°νƒ€μž„ μ‹œμž‘, μ „μ—­ μ½”λ“œ 순차적 μ‹€ν–‰, μ „μ—­ λ³€μˆ˜μ— κ°’ ν• λ‹Ή, ν•¨μˆ˜ 호좜 (마) 

- ν•¨μˆ˜ 호좜 μ‹œ 순차적으둜 μ‹€ν–‰λ˜λ˜ μ „μ—­ μ½”λ“œμ˜ 싀행이 μΌμ‹œ μ€‘λ‹¨λ˜λ©°, ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ§„μž…ν•œλ‹€. (=== μ½”λ“œμ˜ μ œμ–΄κΆŒμ΄ ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ΄λ™ν•œλ‹€) 

 

3. ν•¨μˆ˜ μ½”λ“œ 평가

- λ§€κ°œλ³€μˆ˜, 지역 λ³€μˆ˜ μ‹€ν–‰ (λ‹€), 지역 μŠ€μ½”ν”„μ— 등둝

- this 바인딩도 κ²°μ •

 

4. ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰ 

- λŸ°νƒ€μž„ μ‹œμž‘, ν•¨μˆ˜ μ½”λ“œ 순차적 μ‹€ν–‰, 맀개/지역 λ³€μˆ˜μ— κ°’ ν• λ‹Ή, console.log λ©”μ„œλ“œ 호좜

- console.log λ©”μ„œλ“œ 호좜 μ‹œ μ‹λ³„μžμΈ console 을 μŠ€μ½”ν”„ 체인을 톡해 κ²€μƒ‰ν•˜λ©°, 이λ₯Ό μœ„ν•΄ ν•¨μˆ˜μ˜ 지역 μŠ€μ½”ν”„λŠ” μƒμœ„ μŠ€μ½”ν”„ (μ „μ—­) κ³Ό μ—°κ²°λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. 검색 κ²°κ³Ό, console 은 μŠ€μ½”ν”„ 체인에 λ“±λ‘λ˜μ–΄ μžˆμ§€ μ•Šμ€ λŒ€μ‹  μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‘œ μ‘΄μž¬ν•  것이닀. 

- console 객체의 ν”„λ‘œν† νƒ€μž… 체인을 κ²€μƒ‰ν•˜μ—¬ log ν”„λ‘œνΌν‹°λ₯Ό μ–»λŠ”λ‹€. 

- console.log λ©”μ„œλ“œμ˜ 인자둜 μ „λ‹¬λœ ν‘œν˜„μ‹μ΄ (x + y) ν‰κ°€λ˜λ©°, x 와 y 의 μ‹λ³„μžλŠ” μŠ€μ½”ν”„ 체인을 톡해 κ²€μƒ‰ν•œλ‹€. 

- console.log λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λ©°, μ’…λ£Œλ˜λ©΄ ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰ μ—­μ‹œ μ’…λ£Œλœλ‹€. 

 

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

- μΌμ‹œ μ€‘λ‹¨λ˜μ—ˆλ˜ μ „μ—­ μ½”λ“œμ˜ 싀행이 μž¬κ°œλœλ‹€.

 

❗전역 κ°μ²΄λŠ” μ „μ—­ μ½”λ“œκ°€ ν‰κ°€λ˜κΈ° 이전에 μƒμ„±λ˜λ©°, 이 λ•Œ built-in μ „μ—­ ν”„λ‘œνΌν‹°, ν•¨μˆ˜, 객체가 μΆ”κ°€λœλ‹€. μ „μ—­ κ°μ²΄λŠ” Object.prototype λ₯Ό μƒμ†λ°›λŠ”λ‹€. 

 

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

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλž€, μœ„μ˜ μ˜ˆμ‹œμ—μ„œ λ“±μž₯ν•œ μŠ€μ½”ν”„, μ‹λ³„μž (λ³€μˆ˜, ν•¨μˆ˜λͺ… λ“±), μ½”λ“œ μ‹€ν–‰ μˆœμ„œ 등을 κ΄€λ¦¬ν•˜λŠ” μ˜μ—­μ΄λ‹€. μ†ŒμŠ€μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ ν™˜κ²½μ„ μ œκ³΅ν•˜λ©°, μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό κ΄€λ¦¬ν•˜λŠ” μΌμ’…μ˜ λ‚΄λΆ€ λ©”μ»€λ‹ˆμ¦˜μ΄λ‹€. JS 의 λͺ¨λ“  μ½”λ“œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 톡해 μ‹€ν–‰λ˜λ©°, κ΄€λ¦¬λœλ‹€. 

 

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—λŠ” λ ‰μ‹œμ»¬ ν™˜κ²½κ³Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ΄λΌλŠ” 두 가지 ꡬ성 μš”μ†Œκ°€ μ‘΄μž¬ν•œλ‹€. 

 

πŸ“Œ  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ€ ν”νžˆ μƒκ°ν•˜λŠ” 콜 μŠ€νƒ (Call Stack) κ³Ό λ™μΌν•˜λ‹€. 이 μŠ€νƒμ˜ μ£Όμš” 역할은 λ°”λ‘œ μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό κ΄€λ¦¬ν•˜λŠ” 것이닀. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ†ŒμŠ€μ½”λ“œλ₯Ό ν‰κ°€ν•˜λ©° μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€κ³  μ–ΈκΈ‰ν–ˆμ—ˆλŠ”λ°, μ΄λ•Œ μƒμ„±λœ μ»¨ν…μŠ€νŠΈλŠ” μ°¨λ‘€λŒ€λ‘œ μŠ€νƒμ— μΆ”κ°€λœλ‹€. λ˜ν•œ μŠ€νƒμ΄λΌλŠ” μžλ£Œκ΅¬μ‘°μ— 걸맞게, LIFO ꡬ쑰 (μ„ μž…ν›„μΆœ) λ©”μ»€λ‹ˆμ¦˜μ„ 가지고 μžˆμ–΄, λ¨Όμ € μƒμ„±λœ μ»¨ν…μŠ€νŠΈκ°€ 제일 λ§ˆμ§€λ§‰μ— μ œκ±°λœλ‹€. 

 

λ‹€μŒκ³Ό 같은 μ½”λ“œλŠ” μ•„λž˜ 이미지에 λ‚˜μ˜€λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ˜ μž…μΆœ ν˜•νƒœμ™€ μΌμΉ˜ν•œλ‹€. 

 

const x = 1;

function foo () {
    const y = 2;
    
    function bar () {
    	const z = 3;
        console.log(x + y + z);
    }
    bar();
}

foo();

 

EC (Execution Context) Stack 

 

μ€‘μš”ν•œ 점은, μŠ€νƒμ˜ μ΅œμƒμœ„μ— μ‘΄μž¬ν•˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ–Έμ œλ‚˜ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ½”λ“œμ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλΌλŠ” 점이닀. λ”°λΌμ„œ μ΅œμƒμœ„μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” running execution context (μ‹€ν–‰ 쀑인 μ‹±ν–‰ μ»¨ν…μŠ€λ“œ) 둜 λΆˆλ¦°λ‹€. 

 

 

πŸ“Œ  λ ‰μ‹œμ»¬ ν™˜κ²½

λ ‰μ‹œμ»¬ ν™˜κ²½ μ—­μ‹œ 자료ꡬ쑰이며, μ‹λ³„μžμ™€ μ‹λ³„μžμ— λ°”μΈλ”©λœ κ°’, 그리고 μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κΈ°λ‘ν•œλ‹€. λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μŠ€μ½”ν”„μ™€ μ‹λ³„μžλ₯Ό κ΄€λ¦¬ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•œλ‹€. νŠΉλ³„ν•œ 점은 ν‚€λ‘œ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  값에 λ°”μΈλ”©λœ 값을 λ“±λ‘ν•˜μ—¬ 객체 ν˜•νƒœμ˜ μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•œλ‹€. (즉, λ ‰μ‹œμ»¬ ν™˜κ²½ μ—­μ‹œ ν•˜λ‚˜μ˜ κ°μ²΄λΌλŠ” μ˜λ―Έμ΄λ‹€)

 

❗ 사싀 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” λ ‰μ‹œμ»¬ ν™˜κ²½ 말고 Variable Environment λΌλŠ” 또 ν•˜λ‚˜μ˜ μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμœΌλ‚˜, νŠΉλ³„ν•œ κ²½μš°κ°€ μ•„λ‹Œ 이상 (try/catch, eval λ“±) λ‘˜μ˜ λ‚΄μš©μ€ 달라지지 μ•ŠλŠ”λ‹€. λ”°λΌμ„œ 이 κΈ€μ—μ„œλŠ” Variable Environment 에 λŒ€ν•œ μ„€λͺ…은 λ”°λ‘œ ν•˜μ§€ μ•ŠλŠ”λ‹€. 

 

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ ν™˜κ²½ λ ˆμ½”λ“œ (Environment Record) 와 μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° (Outer Lexical Environment Reference) λΌλŠ” 두 개의 μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬μ„±λœλ‹€. 

ν™˜κ²½ λ ˆμ½”λ“œ (Environment Record)
- μŠ€μ½”ν”„μ— ν¬ν•¨λœ μ‹λ³„μž 등둝
- μ‹λ³„μžμ— λ°”μΈλ”©λœ κ°’ 관리 

μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° (Outer Lexical Environment Reference)
- μƒμœ„ μŠ€μ½”ν”„. 즉, ν•΄λ‹Ή μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œ μ†ŒμŠ€μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μƒμœ„ μ½”λ“œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½

 

엔진이 λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜λŠ” κ³Όμ • μ—­μ‹œ 맀우 ꡬ체적이고 μ„ΈλΆ„ν™”λœ λ©”μ»€λ‹ˆμ¦˜μ„ λ”°λ₯Έλ‹€. 이 뢀뢄에 λŒ€ν•΄μ„œλŠ” λ‹€μŒ κΈ€μ—μ„œ μžμ„Ένžˆ μ„œμˆ ν•˜κ³ μž ν•œλ‹€. 

 

β—μœ„ λ‚΄μš©μ„ μ’…ν•©ν•˜μ—¬ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜λŠ” μˆœμ„œλ₯Ό μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

0. μ „μ—­ 객체 생성

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

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

- μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 바인딩

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

- built-in 객체 및 μ „μ—­ μŠ€μ½”ν”„ 제곡

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

- bindingobject 와 μ—°κ²° (0 μ—μ„œ μƒμ„±λœ μ „μ—­ 객체: 여기에 λ“±λ‘ν•˜λ©΄ 이후 체이닝을 톡해 검색 κ°€λŠ₯)

- var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜ (window.x 둜 μ°Έμ‘° κ°€λŠ₯)

- ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ μ „μ—­ ν•¨μˆ˜

3-2. μ„ μ–Έ ν™˜κ²½ λ ˆμ½”λ“œ 생성 

- let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜ (μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹Œ 블둝 내에 쑴재, window.x 둜 μ°Έμ‘° λΆˆκ°€λŠ₯)

4. this 바인딩

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

- μ „μ—­ μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μ†ŒμŠ€μ½”λ“œλŠ” μ—†μœΌλ―€λ‘œ μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ 참쑰값은 null 이닀. (μŠ€μ½”ν”„ 체인의 쒅점) 

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

- μ‹λ³„μžλ₯Ό 검색할 λ•ŒλŠ” μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ 검색

- 검색할 수 μ—†μœΌλ©΄ λ ‰μ‹œμ»¬ ν™˜κ²½ (μƒμœ„ μŠ€μ½”ν”„)둜 μ΄λ™ν•˜μ—¬ 검색

- λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ 참쑰값이 null 일 λ•Œ μ—†λŠ” μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜λ©΄ Reference Error (μ°Έμ‘° μ—λŸ¬) λ°œμƒ --> μ‹λ³„μž 결정에 μ‹€νŒ¨

 

 

πŸ’‘ μ°Έκ³  ) μ „μ—­ 객체와 κ΄€λ ¨ν•˜μ—¬: var, let, const 의 차이 

 

var

- var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ 됨, window.x 둜 μ°Έμ‘° κ°€λŠ₯

- μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계 λ™μ‹œμ— 진행 (평가 μ‹œμ μ— μ „μ—­ 객체(Binding Object)에 등둝, undefined 바인딩)

- λ”°λΌμ„œ ν˜Έμ΄μŠ€νŒ… κ°€λŠ₯ (μ½”λ“œ μ‹€ν–‰ λ‹¨κ³„μ—μ„œ, λ³€μˆ˜ μ„ μ–Έλ¬Έ μ‹€ν–‰ 전에 μ°Έμ‘° κ°€λŠ₯. but, 값은 undefined μž„)

- ν•¨μˆ˜ 선언문이 ν˜Έμ΄μŠ€νŒ… κ°€λŠ₯ν•œ μ΄μœ μ΄κΈ°λ„ 함 (but ν•¨μˆ˜μ˜ 경우 평가 λ‹¨κ³„μ—μ„œ undefined κ°€ μ•„λ‹Œ ν•¨μˆ˜ 객체λ₯Ό 등둝함. μ΄μ μ—μ„œ λ³€μˆ˜μ™€λŠ” 차이가 있음)

 

let, const 

- let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹Œ 블둝 (μŠ€μ½”ν”„) 내에 μ‘΄μž¬ν•¨, window.x 둜 μ°Έμ‘° λΆˆκ°€λŠ₯

- μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계 뢄리됨. μ΄ˆκΈ°ν™” 단계 (λŸ°νƒ€μž„μ΄ μ‹€ν–‰λ˜μ–΄ μ½”λ“œλ₯Ό λ§Œλ‚˜λŠ” 단계) λ₯Ό λ§Œλ‚˜κΈ° μ „κΉŒμ§€λŠ” μΌμ‹œμ  μ‚¬κ°μ§€λŒ€μ— 빠짐

- 평가 λ‹¨κ³„μ—μ„œ λ³€μˆ˜κ°€ μ „μ—­ 객체가 μ•„λ‹Œ "ν™˜κ²½ λ ˆμ½”λ“œ(Declarative Environment Record)" 에 λ“±λ‘λ˜λ‚˜, undefined κ°€ μ•„λ‹Œ <uninitialize> κ°€ 바인딩됨 --> μ΄ˆκΈ°ν™”κ°€ λ˜μ§€ μ•Šμ•„ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μ—†λ‹€λŠ” 의미 (μ°Έμ‘°ν•  수 μ—†λ‹€λŠ” 의미)

- μ‹€μ œ 값이 ν• λ‹Ήλ˜λŠ” μ½”λ“œλ₯Ό λ§Œλ‚˜κΈ° μ „κΉŒμ§€λŠ” μ‚¬μš© λΆˆκ°€ (ν˜Έμ΄μŠ€νŒ… λΆˆκ°€)

 

 

✨  μš”μ•½ 

μžλ°”μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€μ½”λ“œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 따라 λ‹€λ₯Έ μŠ€μ½”ν”„λ₯Ό 가지며, λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λΆ„λ₯˜λœλ‹€. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλž€ μ†ŒμŠ€μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μœ„ν•΄ ν•„μš”ν•œ ν™˜κ²½μ΄λ©°, μŠ€μ½”ν”„λž€ μ‹€ν–‰ 쀑인 μ»¨ν…μŠ€νŠΈμ˜ μœ νš¨ν•œ λ²”μœ„μ΄λ‹€. 

 

 

 

✨  참고자료

λŒ“κΈ€