λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Front-end/JS

μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ Execution Context λœ―μ–΄ 보기

by ciocio 2021. 9. 5.

πŸ“Œ  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ κ³΅λΆ€ν•΄μ•Όν•˜λŠ” 이유

 

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ λ™μž‘ 원리λ₯Ό λ‹΄κ³  μžˆλŠ” 핡심 κ°œλ…μ΄λ‹€ ⭐⭐⭐

 

βœ” μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μŠ€μ½”ν”„λ₯Ό 기반으둜 μ‹λ³„μžμ™€ μ‹λ³„μžμ— 바인딩 된 값을 κ΄€λ¦¬ν•˜λŠ” 방식

βœ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 이유

βœ” ν΄λ‘œμ €μ˜ λ™μž‘ 방식

βœ” νƒœμŠ€ν¬ 큐와 ν•¨κ»˜ λ™μž‘ν•˜λŠ” 이벀트 ν—¨λ“€λŸ¬

βœ” 비동기 처리의 λ™μž‘ 방식

 

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ΄ν•΄ν–ˆμ„ λ•Œ, 이 λͺ¨λ“  것을 μžμ—°μŠ€λŸ½κ²Œ μŠ΅λ“ν•  수 μžˆλ‹€.

 

 

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

 

μ½”λ“œκ°€ μ‹€ν–‰λ˜λ €λ©΄ μŠ€μ½”ν”„, μ‹λ³„μž, μ½”λ“œ μ‹€ν–‰ μˆœμ„œ λ“±μ˜ 관리가 ν•„μš”ν•˜λ‹€.

 

βœ” 선언에 μ˜ν•΄ μƒμ„±λœ λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜, ν•¨μˆ˜, 클래슀..)듀을 μŠ€μ½”ν”„λ₯Ό κ΅¬λΆ„ν•˜μ—¬ λ“±λ‘ν•˜κ³ 

    μƒνƒœ λ³€ν™”(μ‹λ³„μžμ— λ°”μΈλ”©λœ κ°’μ˜ λ³€ν™”)λ₯Ό μ§€μ†μ μœΌλ‘œ 관리해야 ν•œλ‹€.

βœ” μŠ€μ½”ν”„λŠ” 쀑첩 관계에 μ˜ν•΄ μŠ€μ½”ν”„ 체인을 ν˜•μ„±ν•΄μ•Ό ν•œλ‹€.

    즉, μŠ€μ½”ν”„ 체인을 톡해 μƒμœ„ μŠ€μ½”ν”„λ‘œ μ΄λ™ν•˜μ—¬ μ‹λ³„μžλ₯Ό 검색할 수 μžˆμ–΄μ•Ό ν•œλ‹€.

βœ” ν˜„μž¬ μ‹€ν–‰ 쀑인 μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό λ³€κ²½(ex. ν•¨μˆ˜ ν˜ΈμΆœμ— μ˜ν•œ μ‹€ν–‰ μˆœμ„œ λ³€κ²½)ν•  수 μžˆμ–΄μ•Ό ν•˜λ©°,

    λ‹€μ‹œ λ˜λŒμ•„ 갈 μˆ˜λ„ μžˆμ–΄μ•Ό ν•œλ‹€.

 

이 λͺ¨μ˜€λ“  것을 κ΄€λ¦¬ν•˜λŠ” 것이 λ°”λ‘œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ‹€.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹λ³„μž λ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„ 와 μ½”λ“œ μ‹€ν–‰ μˆœμ„œ 관리λ₯Ό κ΅¬ν˜„ν•œ λ‚΄λΆ€ λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ,

λͺ¨λ“  μ½”λ“œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 톡해 μ‹€ν–‰λ˜κ³ , κ΄€λ¦¬λœλ‹€.

 

-->  μ‹λ³„μž 와 μŠ€μ½”ν”„ λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ 으둜 κ΄€λ¦¬ν•˜κ³ ,

-->  μ½”λ“œ μ‹€ν–‰ μˆœμ„œ λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μŠ€νƒ 으둜 κ΄€λ¦¬ν•œλ‹€.

 

 

πŸ“Œ  ECMA script code

 

ECMA script 사양은 μ†ŒμŠ€ μ½”λ“œ(ECMA script code)λ₯Ό 4가지 νƒ€μž…μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€.

ECMA script codeλ₯Ό μ•Œμ•„μ•Όν•˜λŠ” μ΄μœ λŠ”, 이 μ½”λ“œλ“€μ΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λ˜ν•œ 이 4κ°€μ§€λŠ” μ„œλ‘œ λ‹€λ₯Έ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성 κ³Όμ •κ³Ό 관리 λ‚΄μš©μ„ 닀룬닀.

 

μ „μ—­ μ½”λ“œ | global code 전역에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€ μ½”λ“œ. 전역에 μ •μ˜λœ ν•¨μˆ˜λ‚˜ 클래슀 λ“±μ˜ λ‚΄λΆ€ μ½”λ“œλŠ” ν¬ν•¨λ˜μ§€ μ•ŠμŒ.
μ „μ—­ μ½”λ“œλŠ” μ „μ—­ λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ΅œμƒμœ„ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„λ₯Ό 생성해야 ν•œλ‹€.
ν•¨μˆ˜ μ½”λ“œ | function code ν•¨μˆ˜ 내뢀에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€ μ½”λ“œ. ν•¨μˆ˜ 내뢀에 μ€‘μ²©λœ ν•¨μˆ˜, 클래슀 λ“±μ˜ λ‚΄λΆ€ μ½”λ“œλŠ” ν¬ν•¨λ˜μ§€ μ•ŠμŒ.
ν•¨μˆ˜ μ½”λ“œλŠ” 지역 μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•˜κ³ , 지역 λ³€μˆ˜, 맀개 λ³€μˆ˜, arguments 객체λ₯Ό 관리해야 ν•œλ‹€. 그리고 μƒμ„±ν•œ 지역 μŠ€μ½”ν”„λ₯Ό μ „μ—­ μŠ€μ½”ν”„ 체인의 μΌμ›μœΌλ‘œ μ—°κ²°ν•΄μ•Ό ν•œλ‹€.
eval μ½”λ“œ | eval code built-in μ „μ—­ ν•¨μˆ˜μΈ eval ν•¨μˆ˜μ— 인수둜 μ „λ‹¬λ˜μ–΄ μ‹€ν–‰λ˜λŠ” μ†ŒμŠ€μ½”λ“œ.
eval μ½”λ“œλŠ” strict modeμ—μ„œ μžμ‹ λ§Œμ˜ λ…μžμ μΈ μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•œλ‹€.
λͺ¨λ“ˆ μ½”λ“œ | module code λͺ¨λ“ˆ 내뢀에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€ μ½”λ“œ. λͺ¨λ“ˆ λ‚΄λΆ€μ˜ ν•¨μˆ˜, 클래슀 λ“±μ˜ λ‚΄λΆ€ μ½”λ“œλŠ” ν¬ν•¨λ˜μ§€ μ•ŠμŒ.
λͺ¨λ“ˆ μ½”λ“œλŠ” λͺ¨λ“ˆλ³„λ‘œ 독립적인 λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•œλ‹€.

 

μŠ€μ½”ν”„ κ°œλ…μœΌλ‘œ 보면, λ”± ν•œ κ²Ή. ν•œ 겹만 벗겨내어 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€κ³  보면 될 것 κ°™λ‹€.

 

 

πŸ“Œ  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ™μž‘ κ³Όμ •

 

// μ „μ—­
var x = 1;
const y = 2;

// ν•¨μˆ˜ foo
function foo(){
  var x = 3;
  const y = 4;
  
  // ν•¨μˆ˜ bar
  function bar(b){
    const z = 5;
    console.log(a + b + x + y + z);
  }
  
  bar(10);
}

foo(20);  // 42

 

 

μ „μ—­ 객체 생성

μ „μ—­ κ°μ²΄λŠ” μ½”λ“œκ°€ ν‰κ°€λ˜κΈ° 이전에 μƒμ„±λœλ‹€.

빌트인 μ „μ—­ ν”„λ‘œνΌν‹°, 빌트인 μ „μ—­ ν•¨μˆ˜, ν‘œμ€€ 빌트인 객체 ⊂ μ „μ—­ 객체

ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ Web API λ˜λŠ” 호슀트 객체 ⊂ μ „μ—­ 객체

μ „μ—­ 객체도 ν”„λ‘œν† νƒ€μž… 체인의 일원이기에 Object.prototype을 μƒμ†λ°›λŠ”λ‹€.

 

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

01 μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성 Global Execution Contest

02 μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성 Global Lexical Environment

    1 μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œ 생성 Global Environment Record

          1-1 객체 ν™˜κ²½ λ ˆμ½”λ“œ 생성 Object Environment Record

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

    2 this 바인딩

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

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

 

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

01 ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성 Function Execution Contest

02 ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성 Function Lexical Environment

    1 ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œ 생성 Function Environment Record

    2 this 바인딩

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

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

 

μ½”λ“œ μ‹€ν–‰ μ’…λ£Œ

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ ν•΄λ‹Ή μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ œκ±°λœλ‹€.

μ΄ν›„μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ ν˜„μž¬ 싀행쀑인 μ»¨ν…μŠ€νŠΈκ°€ 되고 이 λ˜ν•œ μŠ€νƒμ—μ„œ 제거되며 반볡반볡.

----------------------------------------------------------------------------------------------------------------

 

진행과정을 보고 μ§κ΄€μ μœΌλ‘œ μ•Œ 수 μžˆλŠ” 점은 

 

첫째, μ½”λ“œ μ‹€ν–‰κ³Ό λ™μ‹œμ— μ „μ—­ 객체가 μƒμ„±λœλ‹€.

λ‘˜μ§Έ, μ½”λ“œμ˜ 평가와 싀행은 연속적인 관계닀. 

μ…‹μ§Έ, μŠ€μ½”ν”„μ˜ 진행과정을 λ³΄λ‹ˆ 자료ꡬ쑰 Stackκ³Ό λ™μΌν•˜κ²Œ μž‘λ™ν•œλ‹€.

 

 

πŸ“  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ ν•œλˆˆμ— 보기                                                                       

 

 

 

μ½”λ“œμ˜ 평가와 싀행을 λ°˜λ³΅ν•˜λ©° λ§Œλ“€μ–΄μ‘Œλ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ“€μ€ μŠ€νƒμ— 차곑차곑 μŒ“μΈλ‹€.

λ§ˆμ§€λ§‰ ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μŠ€νƒμ— μŒ“μ˜€μ„ λ•Œ, ν•΄λ‹Ή μ½”λ“œμ˜ 싀행을 μ’…λ£Œμ‹œν‚€κ³  LIFO μ°¨λ‘€λŒ€λ‘œ μ½”λ“œ 싀행을 μ’…λ£Œμ‹œν‚¨λ‹€.

μŠ€νƒ μ•ˆμ—μ„œ 제일 μœ„μͺ½μ— μžˆλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ (녹색 λ°•μŠ€)κ°€ λœλ‹€. running execution context

ν˜„μž¬ 싀행쀑인 μ»¨ν…μŠ€νŠΈλŠ” μ½”λ“œμ˜ μ œμ–΄κΆŒμ„ μ₯κ³  있기 λ•Œλ¬Έμ— μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μ½”λ“œμ˜ 싀행은 μΌμ‹œ μ€‘λ‹¨λœλ‹€.

 

 

πŸ“  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ ‰μ‹œμ»¬ ν™˜κ²½ ν•œλˆˆμ— 보기                                                            

----------------------------------------------------------------------------   μ „μ—­μ½”λ“œ ν‰κ°€λΆ€ν„°μ‹€ν–‰κΉŒμ§€

 

β—Ύ μ½”λ“œ 평가

 

 

μ „μ—­ μ‹€ν–‰ μ»¨νƒμŠ€νŠΈλ₯Ό μƒμ„±ν•˜μ—¬ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ— pushν•œλ‹€.

μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” runnung execution context이닀.

 

 

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

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ ν™˜κ²½ λ ˆμ½”λ“œμ™€ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰둜 κ΅¬μ„±λœλ‹€.

 

 

ν™˜κ²½ λ ˆμ½”λ“œλŠ”

μ „μ—­ λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ „μ—­ μŠ€μ½”ν”„, μ „μ—­ 객체의 빌트인 μ „μ—­ ν”„λ‘œνΌν‹° / 빌트인 μ „μ—­ ν•¨μˆ˜ / ν‘œμ€€ 빌트인 객체λ₯Ό μ œκ³΅ν•œλ‹€.

 

λͺ¨λ“  μ „μ—­ λ³€μˆ˜κ°€ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λ˜μ—ˆλ˜ (var) μ‹œμ ˆμ—λŠ” μ „μ—­ 객체 μžμ²΄κ°€ μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ 역할을 μˆ˜ν–‰ν–ˆλ‹€.

ν•˜μ§€λ§Œ 지역 λ³€μˆ˜ letκ³Ό const의 λ“±μž₯으둜, 기쑴의 var μ „μ—­ λ³€μˆ˜μ™€ letμ΄λ‚˜ const둜 μ„ μ–Έν•œ μ „μ—­λ³€μˆ˜λ₯Ό λ‚˜λˆ μ„œ κ΄€λ¦¬ν•΄μ•Όν–ˆλ‹€.

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

 

* 객체 ν™˜κ²½ λ ˆμ½”λ“œλŠ” varν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ μ „μ—­ ν•¨μˆ˜, μ „μ—­ 객체의 빌트인 μ „μ—­ ν”„λ‘œνΌν‹° / 빌트인 μ „μ—­ ν•¨μˆ˜ / ν‘œμ€€ 빌트인 객체λ₯Ό κ΄€λ¦¬ν•œλ‹€. varν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ μ „μ—­ ν•¨μˆ˜λŠ” μ—°κ²°λœ 객체 ν™˜κ²½ λ ˆμ½”λ“œμ˜ BindingObjectλ₯Ό 톡해 μ „μ—­ 객체의 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œκ°€ λœλ‹€.

 

-->  μ΄λŠ” μš°λ¦¬κ°€ μ „μ—­ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μž(window)없이 μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” λ©”μ»€λ‹ˆμ¦˜μ΄λ‹€.

-->  alertλΌλŠ” λ©”μ„œλ“œλ₯Ό μ“Έ λ•Œ window.alert라고 μ•ˆμ¨λ„ λ˜λŠ” κ²ƒμ²˜λŸΌ !!!

 


❗ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ… ❗ (feat. var  λ³€μˆ˜μ˜ 특이점)

varλŠ” λ…νŠΉν•œ 아이닀. letκ³Ό const와 달리 "μ„ μ–Έ 단계"와 "μ΄ˆκΈ°ν™” 단계"κ°€ λ™μ‹œμ— μ§„ν–‰λœλ‹€.

μ „μ—­ μ½”λ“œ 평가 λ‹¨κ³„μ—μ„œ 객체 ν™˜κ²½ λ ˆμ½”λ“œμ— λ°”μΈλ”©λœ BindingObjectλ₯Ό 톡해 μ „μ—­ 객체에 λ³€μˆ˜ μ‹λ³„μžλ₯Ό ν‚€λ‘œ λ“±λ‘ν•œ λ‹€μŒ, μ•”λ¬΅μ μœΌλ‘œ undefinedλ₯Ό λ°”μΈλ”©ν•œλ‹€.  (letμ΄λ‚˜ constλŠ” "μ„ μ–Έ 단계"와 "μ΄ˆκΈ°ν™” 단계"κ°€ λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λœλ‹€.)

이미 undefined으둜 μ΄ˆκΈ°ν™” λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— μ½”λ“œ μ‹€ν–‰ λ‹¨κ³„μ—μ„œ var을 μ°Έμ‘°ν•  수 μžˆλ‹€ !! 

var이 μ„ μ–Έλœ μœ„μΉ˜κ°€ μ €μ–΄μ–΄μ–΄ 밑에 μžˆμ–΄λ„ 이미 μ „μ—­ 객체에 킀와 κ°’(undefined)이 λ°”μΈλ”©λ˜μ–΄μžˆκΈ°λ•Œλ¬Έμ— μ°Έμ‘° κ°€λŠ₯ν•˜λ‹€ 

 

-->  λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 원인이닀.

 

❗ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… ❗

ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜κ°€ ν‰κ°€λ˜λ©΄ ν•¨μˆ˜

이름과 λ™μΌν•œ μ΄λ¦„μ˜ μ‹λ³„μžλ₯Ό BindingObjectλ₯Ό 톡해 전역객체에 ν‚€λ‘œ λ“±λ‘λ˜κ³  μƒμ„±λœ ν•¨μˆ˜ 객체가 μ¦‰μ‹œ ν• λ‹Ήλœλ‹€.

 

-->  ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 원인이닀. 

 

❗ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…κ³Ό ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… 의 차이❗

-->  λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…κ³Ό ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ˜ 차이가 μžˆλ‹€λ©΄, λ³€μˆ˜λŠ” μ„ μ–Έ -> μ΄ˆκΈ°ν™” -> ν• λ‹Ή 3단계λ₯Ό 거쳐 μƒμ„±λ˜κ³ 
ν•¨μˆ˜λŠ” μ„ μ–Έ -> ν• λ‹Ή 2λ‹¨κ³„λ§Œ 거쳐 μƒμ„±λ˜κΈ° λ•Œλ¬Έμ—, λ³€μˆ˜λŠ” undefined둜 μ°Έμ‘°ν•˜κ²Œ λ˜μ§€λ§Œ
ν•¨μˆ˜λŠ” μ°Έμ‘°ν–ˆμ„ λ•Œ λ°”λ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€λŠ” 점이닀.


 

* 선언적 ν™˜κ²½ λ ˆμ½”λ“œλŠ” 객체 ν™˜κ²½ λ ˆμ½”λ“œκ°€ κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” 아이듀, letκ³Ό const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•œλ‹€.

letκ³Ό const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” varκ³Ό λ‹€λ₯΄κ²Œ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λ˜μ§€ μ•ŠλŠ”λ‹€. 

κ·Έλž˜μ„œ window.y와 같이 μ „μ—­ 객체 ν”„λ‘œνΌν‹°λ‘œμ„œ μ°Έμ‘°ν•  수 μ—†λ‹€. 

λ˜ν•œ μ•žμ„œ λ§ν–ˆλ“―, μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λ˜κΈ° λ•Œλ¬Έμ—

μ½”λ“œ μ‹€ν–‰ λ‹¨κ³„μ—μ„œ λ³€μˆ˜ 선언문에 λ„λ‹¬ν•˜κΈ° μ „κΉŒμ§€ 이 아이듀은 μΌμ‹œμ  μ‚¬κ°μ§€λŒ€μ— λΉ μ§€κ²Œ λœλ‹€.

 

μΌμ‹œμ  μ‚¬κ°μ§€λŒ€ Temporal Dead Zone

 

letκ³Ό const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λ„ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 것은 변함이 μ—†λ‹€.

varκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ (μ½”λ“œ μ‹€ν–‰ 이전에) μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λ“±λ‘λ˜μ–΄ μžˆλŠ” 것은 κ°™κΈ° λ•Œλ¬Έμ΄λ‹€.

λ‹€λ§Œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ λ³€μˆ˜ 선언문에 λ„λ‹¬ν•΄μ•Όλ§Œ 값을 μ°Έμ‘°ν•  수 μžˆκΈ°μ— μ΄μ „κΉŒμ§€λŠ” μ°Έμ‘°ν•˜μ§€ λͺ»ν•œλ‹€λŠ” 점이 λ‹€λ₯΄λ‹€.

(varλŠ” λ³€μˆ˜ μ„ μ–Έλ¬Έ λ„λ‹¬μ•ˆν•΄λ„ κΈ°λƒ₯ undefined μ°Έμ‘° κ°€λŠ₯)

 

 

this 바인딩

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

일반적으둜 μ „μ—­ μ½”λ“œμ—μ„œ thisλŠ” ν•΄λ‹Ή μ „μ—­ 객체λ₯Ό κ°€λ¦¬ν‚€κΈ°λ•Œλ¬Έμ— μ „μ—­ 객체가 λ°”μΈλ”©λ˜μ—ˆλ‹€κ³  보면 λœλ‹€.

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

this 바인딩은 μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ—λ§Œ μ‘΄μž¬ν•œλ‹€. 객체 ν™˜κ²½ λ ˆμ½”λ“œμ™€ 선언적 ν™˜κ²½ λ ˆμ½”λ“œμ—λŠ” this 바인딩이 μ—†λ”° !!

 

 

μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λŠ” μƒμœ„ μŠ€μ½”ν”„λ₯Ό 가리킨닀.

(μƒμœ„ μŠ€μ½”ν”„ === ν˜„μž¬ 평가쀑인 μ†ŒμŠ€μ½”λ“œλ₯Ό ν¬ν•¨ν•˜κ³ μžˆλŠ” μ™ΈλΆ€ μŠ€μ½”ν”„ 1κ²Ή) 

이λ₯Ό 톡해 μŠ€μ½”ν”„ 체인을 κ΅¬ν˜„ν•œλ‹€. (μŠ€μ½”ν”„ 체인은 단방ν–₯ λ§ν¬λ“œ λ¦¬μŠ€νŠΈμž„ γ…Žγ…Ž)

μ „μ—­ μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μ†ŒμŠ€μ½”λ“œλŠ” μ—†μœΌλ―€λ‘œ, μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°μ—λŠ” null 값이 ν• λ‹Ήλœλ‹€.

μ΄λŠ” μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μŠ€μ½”ν”„ 체인의 쒅점에 μ‘΄μž¬ν•¨μ„ μ˜λ―Έν•œλ‹€.

 

 

 

β—Ύ μ½”λ“œ μ‹€ν–‰

 

 

이제 μ „μ—­μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜λ©΄μ„œ μ „μ—­ λ³€μˆ˜μ— 값이 ν• λ‹Ήλœλ‹€.

μ½”λ“œκ°€ μ‹€ν–‰μ΄λ˜μ•Όλ§Œ λ³€μˆ˜μ˜ κ°’ ν• λ‹Ή 단계가 μ‹€ν–‰λœλ‹€ !!

 

λ³€μˆ˜ ν• λ‹Ήλ¬Έμ΄λ‚˜ ν•¨μˆ˜ ν˜ΈμΆœλ¬Έμ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•΄λ‹Ή λ³€μˆ˜/ν•¨μˆ˜ 이름이 μ„ μ–Έλœ μ‹λ³„μžμΈμ§€ ν™•μΈν•˜λŠ” 과정이 ν•„μš”ν•˜λ‹€.

μ‹λ³„μžκ°€ 선언이 λ˜μ—ˆλ‹€ν•˜λ”λΌλ„ μŠ€μ½”ν”„κ°€ λ‹€λ₯΄λ©΄ μ‹λ³„μžλΌλ¦¬ 같은 이름을 κ°€μ§ˆ μˆ˜λ„ 있기 λ•Œλ¬Έμ΄λ‹€.

μ–΄λ–€ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•΄μ•Όν•˜λŠ” 지 κ²°μ •ν•˜λŠ” 과정을 μ‹λ³„μž κ²°μ • identifier resolution 이라고 ν•œλ‹€. 

 

μ‹λ³„μž 결정을 μœ„ν•΄ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλΆ€ν„° μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•΄λ‚˜κ°€λŠ”λ°, λ‚˜μ˜¬ λ•ŒκΉŒμ§€ !! μŠ€μ½”ν”„λ₯Ό ν•œμ»€ν’€μ”© 벗겨가며 κ²€μ‚¬ν•œλ‹€.

μ•„ λ¬Όλ‘  μ§€κΈˆμ€ μ „μ—­ μ½”λ“œμ΄λ―€λ‘œ, μ „μ—­ 객체 μ•ˆμ— λ³€μˆ˜ μ‹λ³„μžκ°€ μ—†μœΌλ©΄ μ°Έμ‘° μ—λŸ¬ReferenceErrorλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

 

 

----------------------------------------------------------------------------   ν•¨μˆ˜μ½”λ“œ ν‰κ°€λΆ€ν„°μ‹€ν–‰κΉŒμ§€

 

β—Ύ μ½”λ“œ 평가

 

 

μ „μ—­μ—μ„œ ν•¨μˆ˜κ°€ 호좜되면, μ „μ—­ μ½”λ“œμ˜ 싀행을 μΌμ‹œ μ€‘λ‹¨ν•œλ‹€.

(μ½”λ“œμ˜ μ œμ–΄κΆŒμ€ 이제 ν•΄λ‹Ή ν•¨μˆ˜κ°€ μ₯κ³  μžˆλ‹€.)

제일 λ¨Όμ € ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€.

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

 

 

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

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ ν™˜κ²½ λ ˆμ½”λ“œμ™€ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰둜 κ΅¬μ„±λœλ‹€.

 

 

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

 

 

 

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

[ [ ThisValue ] ] λ‚΄λΆ€ μŠ¬λ‘―μ— 바인딩 될 κ°μ²΄λŠ” μ „μ—­ 객체 (window)λ₯Ό 가리킨닀.

이 μ˜ˆμ œμ—μ„œ 호좜된 ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.
( β€» thisλŠ” ν•¨μˆ˜κ°€ μ–΄λ–€ ν˜•νƒœλ‘œ ν˜ΈμΆœλ˜λŠ” 지에 따라 λ°”μΈλ”©λ˜λŠ” 값이 달라진닀 )

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

 

 

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

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

이 μ˜ˆμ‹œμ—μ„œ ν•¨μˆ˜κ°€ ν‰κ°€λ˜κ³  μžˆλŠ” μ‹œμ μ—μ„œ μ‹€ν–‰λ˜κ³  μžˆλŠ” μ»¨ν…μŠ€νŠΈλŠ” μ „μ—­ μ»¨ν…μŠ€νŠΈμ΄λ―€λ‘œ, μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°κ°€ ν• λ‹Ήλœλ‹€.

ν• λ‹Ήλœ λ ‰μ‹œμ»¬ ν™˜κ²½μ€, ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [ [ Environment ] ] 에 μ €μž₯된 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„μ΄λ‹€.

( μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ •μ˜ -> 평가 -> 객체 생성 과정을 톡해 ν•¨μˆ˜λ₯Ό μ½λŠ”λ‹€.

μ΄λ•Œ [ [ Environment ] ] λ‚΄λΆ€ μŠ¬λ‘―μ€ ν•¨μˆ˜κ°€ 생성될 λ•Œμ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό 캑처(μ €μž₯)ν•œλ‹€.
μΊ‘μ³λ³Έμ΄λ‹ˆκΉŒ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„κ°€ ν• λ‹Ήλœ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄λΌκ³  λ³Ό 수 μžˆλ‹€. )


❗ ν΄λ‘œμ € β— ( feat. ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [ [ Environment ] ], λ ‰μ‹œμ»¬ μŠ€μ½”ν”„ )

ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κΈ° μ „, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ 평가 단계λ₯Ό λ¨Όμ € κ±°μΉœλ‹€.

이 λ•Œ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μƒμ„±λ˜λŠ”λ°,

이 λ ‰μ‹œμ»¬ ν™˜κ²½μ— ν•¨μˆ˜μ˜ ν™˜κ²½ λ ˆμ½”λ“œ (즉, λ‚΄λΆ€ λ³€μˆ˜λ‚˜ ν•¨μˆ˜ λ“±), this, μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ 바인딩 λ˜μ–΄μžˆλ‹€.
( μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ ν•¨μˆ˜ 객체가 생성될 λ•Œ
[ [ Environment ] ] λΌλŠ” λ‚΄λΆ€ μŠ¬λ‘―μ— ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό μ €μž₯ν•΄λ‘”λ‹€.
)

μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„κ°€ ν¬ν•¨λœ 참쑰값을 μ˜λ―Έν•œλ‹€.

λ ‰μ‹œμ»¬ ν™˜κ²½ κ°„μ˜ μŠ€μ½”ν”„ 체이닝 덕뢄에 ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•΄λ„

μ •μ˜λœ μ‹œμ μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό μ°Έμ‘°ν•  수 있게 λœλ‹€.


 

β—Ύ μ½”λ“œ μ‹€ν–‰

 

 

λŸ°νƒ€μž„ ~!

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

그리고 λ‹€μŒ ν•¨μˆ˜(λ‚΄λΆ€ ν•¨μˆ˜)κ°€ ν˜ΈμΆœλœλ‹€.

 

 

πŸ“  etc. bar ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰                                                                                  

 

직접 λ§Œλ“€λ©΄μ„œ 읡힌 execution context

 

μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ foo ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ˜ˆμ‹œλ₯Ό 톡해 μ‚΄νŽ΄λ΄€λŠ”λ°,

아무리 ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  μ‹€ν–‰λ˜λŠ” 과정이 같더라도
bar ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ†Œμ™Έλ˜λŠ” 것 κ°™μ•„ κ²°κ³Όλ₯Ό μ™„μ„±ν•΄λ³΄μ•˜λ‹€.

λ³΄μ•˜λŠ”κ°€ λ‚˜μ˜ κ΄‘κΈ°λ₯Ό .... μžλ°”μŠ€ν¬λ¦½νŠΈμ— μ§„μ‹¬μž„ 

 

ν‘œμ™€ 그림듀은 μ œκ°€ λ‹€ λ§Œλ“€μ—ˆμŠ΄λ‹Ή 예 κ·Έλƒ₯ κ·Έλ ‡λ‹€κ³ μš©

λ°˜μ‘ν˜•

λŒ“κΈ€