TL

toothlessdev

πŸ€” Recap

이전 κΈ€μ—μ„œλŠ” JavaScript μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ κ°œλ…κ³Ό κ΅¬μ„±μš”μ†Œ, Creation Phase와 Execution Phase에 λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

✏️ 이전글 : JavaScript Execution Context μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ - κ°œλ…νŽΈ (feat. ν˜Έμ΄μŠ€νŒ…, μŠ€μ½”ν”„ 체인, ν΄λ‘œμ €)

λ‹€μ‹œ ν•œλ²ˆ μ •λ¦¬ν•˜μžλ©΄,

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

  1. JavaScript μ½”λ“œκ°€ Isolate ν•˜κ²Œ μ‹€ν–‰λ˜λŠ” ν™˜κ²½μ„ κ°€λ¦¬ν‚€λŠ” Realm
  2. let, const, class, ν•¨μˆ˜ν‘œν˜„μ‹ 을 μœ„ν•œ μ‹λ³„μž 바인딩을 μ €μž₯ν•˜λŠ” Lexical Environment
  3. var, ν•¨μˆ˜μ„ μ–Έλ¬Έ 을 μœ„ν•œ μ‹λ³„μž 바인딩을 μ €μž₯ν•˜λŠ” Variable Environment

으둜 κ΅¬μ„±λ˜μ–΄ 있고,

  1. μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜κ±°λ‚˜,
  2. ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜κ±°λ‚˜,
  3. λͺ¨λ“ˆμ΄ λ‘œλ“œλ λ•Œ,
  4. eval() ν•¨μˆ˜κ°€ 호좜될 λ•Œ

μ‹€ν–‰μ»¨ν…μŠ€νŠΈκ°€ 생성 (Creation Phase) 되며, Lexical Environment와 Variable Environmentκ°€ μƒμ„±λ˜κ³ ,
μ‹λ³„μžλ₯Ό μŠ€μΊ”ν•˜μ—¬ λ©”λͺ¨λ¦¬ 곡간을 μ˜ˆμ•½ν•©λ‹ˆλ‹€. (μ΄λ•Œ, Hoisting 이 λ°œμƒν•©λ‹ˆλ‹€)

πŸ”Ž 예제둜 μ•Œμ•„λ³΄λŠ” μ‹€ν–‰μ»¨ν…μŠ€νŠΈμ˜ λ™μž‘μ›λ¦¬

이번 κΈ€μ—μ„œλŠ” κ°„λ‹¨ν•œ μ˜ˆμ œμ½”λ“œλ₯Ό λ°”νƒ•μœΌλ‘œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ–΄λ–»κ²Œ μƒμ„±λ˜κ³ , μ‹λ³„μžλ₯Ό μ°ΎλŠ” κ³Όμ •, ν΄λ‘œμ €μ™€ ν˜Έμ΄μŠ€νŒ…μ΄ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ λ‹¨κ³„λ³„λ‘œ μ‹œκ°ν™”ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

var message = "μ•ˆλ…•ν•˜μ„Έμš”! ";
const firstName = "λŒ€κ±΄";
let lastName = "κΉ€";

class Person {
    constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    getFullName() {
        return `${this.firstName} ${this.lastName}`;
    }
}

function greet(baseGreetMessage) {
    const person = new Person(firstName, lastName);

    function createGreetingMessage() {
        return `${baseGreetMessage} ${person.getFullName()}`;
    }
    return createGreetingMessage;
}

const sayHello = greet(message);
console.log(sayHello()); // "μ•ˆλ…•ν•˜μ„Έμš”! λŒ€κ±΄ κΉ€"

1. Script Loaded

κ°€μž₯ λ¨Όμ € μŠ€ν¬λ¦½νŠΈκ°€ λ‘œλ“œλ˜λ©΄, Realm 이 μƒμ„±λ©λ‹ˆλ‹€.
λ‚΄μž₯객체 (Intrinsics) 와 전역객체 (Global Object) κ°€ μƒμ„±λ˜κ³ ,

Global Environment Record μ—λŠ”
[[Declarative Record]] [[Object Record]] [[Global This]] [[Outer Env Reference]] 슬둯이 μƒμ„±λ©λ‹ˆλ‹€.

ν˜„μž¬ μŠ€ν¬λ¦½νŠΈκ°€ 졜초둜 λ‘œλ“œλ˜μ—ˆμœΌλ―€λ‘œ,
Realm 의 [[Outer Env Reference]] μŠ¬λ‘―μ€ null 을 μ°Έμ‘°ν•©λ‹ˆλ‹€.
(즉, μ™ΈλΆ€ Environment Record κ°€ μ—†μœΌλ―€λ‘œ)

2. Global Execution Context - Creation Phase

Realm 이 μƒμ„±λ˜λ©΄, Global Execution Context κ°€ 생성(Creation Phase)λ©λ‹ˆλ‹€.

Global Execution Context 의 Lexical Environment λŠ” Realm 의 Global Environment Record 의 [[Declarative Record]] μŠ¬λ‘―μ„ μ°Έμ‘°ν•©λ‹ˆλ‹€.

Variable Environment λŠ” Realm 의 Global Environment Record 의 [[Object Record]] μŠ¬λ‘―μ„ μ°Έμ‘°ν•©λ‹ˆλ‹€.



Creation Phase μ—μ„œλŠ” μ‹λ³„μžλ“€μ„ μŠ€μΊ”ν•˜μ—¬ λ©”λͺ¨λ¦¬ 곡간을 μ˜ˆμ•½ν•©λ‹ˆλ‹€.

  1. message : var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜μ—ˆμœΌλ―€λ‘œ, Variable Environment Record 에 λ“±λ‘λ˜κ³  undefined 둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.
  2. firstName : const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜μ—ˆμœΌλ―€λ‘œ, Lexical Environment Record 에 λ“±λ‘λ˜κ³  Temporal Dead Zone(TDZ) μƒνƒœκ°€ λ©λ‹ˆλ‹€.
    (μ΄λ•Œ λ³€μˆ˜μ— μ ‘κ·Όμ‹œ Reference Error λ°œμƒ)
  3. lastName : let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜μ—ˆμœΌλ―€λ‘œ, Lexical Environment Record 에 λ“±λ‘λ˜κ³  Temporal Dead Zone(TDZ) μƒνƒœκ°€ λ©λ‹ˆλ‹€.
    (μ΄λ•Œ λ³€μˆ˜μ— μ ‘κ·Όμ‹œ Reference Error λ°œμƒ)
  4. Person : class ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜μ—ˆμœΌλ―€λ‘œ, Lexical Environment Record 에 λ“±λ‘λ˜κ³  Temporal Dead Zone(TDZ) μƒνƒœκ°€ λ©λ‹ˆλ‹€.
    (μ΄λ•Œ λ³€μˆ˜μ— μ ‘κ·Όμ‹œ Reference Error λ°œμƒ)
  5. greet : function declaration 으둜 μ„ μ–Έλ˜μ—ˆμœΌλ―€λ‘œ, Variable Environment Record 에 λ“±λ‘λ˜κ³  β€ΌοΈν•¨μˆ˜κ°μ²΄κ°€ Heap μ˜μ—­μ— μƒμ„±λœ λ’€ κ³§λ°”λ‘œ 바인딩‼️ λ©λ‹ˆλ‹€.
  6. sayHello : const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜μ—ˆμœΌλ―€λ‘œ, Lexical Environment Record 에 λ“±λ‘λ˜κ³  Temporal Dead Zone(TDZ) μƒνƒœκ°€ λ©λ‹ˆλ‹€.
    (μ΄λ•Œ λ³€μˆ˜μ— μ ‘κ·Όμ‹œ Reference Error λ°œμƒ)

3. Global Execution Context - Execution Phase

Creation Phase κ°€ λλ‚˜λ©΄, μ‹€μ œ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” Execution Phase κ°€ μ‹€ν–‰λ©λ‹ˆλ‹€
μƒμ„±λœ Global Execution Context λŠ” μ½œμŠ€νƒμ— μŒ“μ΄κ³ , μ‹€ν–‰λ©λ‹ˆλ‹€.

  1. message : "μ•ˆλ…•ν•˜μ„Έμš”! " λ¬Έμžμ—΄μ΄ Heap μ˜μ—­μ— μƒμ„±λ˜κ³ , message λ³€μˆ˜λŠ” ν•΄λ‹Ή 값을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  2. firstName : "λŒ€κ±΄" λ¬Έμžμ—΄μ΄ Heap μ˜μ—­μ— μƒμ„±λ˜κ³ , firstName λ³€μˆ˜λŠ” ν•΄λ‹Ή 값을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  3. lastName : "κΉ€" λ¬Έμžμ—΄μ΄ Heap μ˜μ—­μ— μƒμ„±λ˜κ³ , lastName λ³€μˆ˜λŠ” ν•΄λ‹Ή 값을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  4. Person : Person 클래슀의 μƒμ„±μž ν•¨μˆ˜μ™€ getFullName λ©”μ„œλ“œκ°€ Heap μ˜μ—­μ— μƒμ„±λ˜κ³ , Person 의 ν”„λ‘œν† νƒ€μž… 체인에 μ—°κ²°λ©λ‹ˆλ‹€.
  5. greet : greet ν•¨μˆ˜λŠ” Creation Phase μ—μ„œ 이미 Heap μ˜μ—­μ— μƒμ„±λ˜μ—ˆμœΌλ―€λ‘œ κ±΄λ„ˆλœλ‹ˆλ‹€
  6. sayHello : greet ν•¨μˆ˜κ°€ 호좜되기 μ „κΉŒμ§€λŠ” Temporal Dead Zone(TDZ) μƒνƒœμž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ, sayHello μ΄ˆκΈ°ν™”λ₯Ό μœ„ν•΄ greet ν•¨μˆ˜κ°€ 호좜되면, μƒˆλ‘œμš΄ Function Execution Context κ°€ μƒμ„±λ©λ‹ˆλ‹€.
Function Execution Context λ˜ν•œ Creation Phase 와 Execution Phase λ₯Ό κ±°μΉ©λ‹ˆλ‹€.

4. greet Function Execution Context - Creation Phase

greet ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜κΈ°μœ„ν•΄ greet Function Execution Context 의 Creation Phase κ°€ μ‹œμž‘λ©λ‹ˆλ‹€.

  1. baseGreetMessage : [[Parameter]] (λ˜λŠ” [[Arguments]]) μŠ¬λ‘―μœΌλ‘œλΆ€ν„° baseGreetMessage 에 λŒ€ν•œ μ‹λ³„μž 바인딩이 Lexical Environment Record에 μƒμ„±λ©λ‹ˆλ‹€. (단, ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λŠ” Creation Phase μ—μ„œ μ¦‰μ‹œ μΈμˆ˜κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€)
  2. person : const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜μ—ˆμœΌλ―€λ‘œ, Lexical Environment Record 에 λ“±λ‘λ˜κ³  Temporal Dead Zone(TDZ) μƒνƒœκ°€ λ©λ‹ˆλ‹€. (μ΄λ•Œ λ³€μˆ˜μ— μ ‘κ·Όμ‹œ Reference Error λ°œμƒ)
  3. createGreetingMessage : ν•¨μˆ˜ μ„ μ–Έλ¬Έμ΄λ―€λ‘œ, greet Function Execution Context 의 Variable Environment 에 λ“±λ‘λ˜κ³ , createGreetingMessage ν•¨μˆ˜ 객체가 Heap μ˜μ—­μ— μƒμ„±λ©λ‹ˆλ‹€.
    μ΄λ•Œ, createGreetingMessage ν•¨μˆ˜μ˜ [[Scope]](λ˜λŠ” ES6 [[Environment]]) μŠ¬λ‘―μ€ greet ν•¨μˆ˜μ˜ Lexical Environment λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€. (‼️ ν΄λ‘œμ € 생성 ‼️)
  4. [[Outer Env Reference]] : greet ν•¨μˆ˜μ˜ Lexical Environment 의 [[Outer Env Reference]] λŠ” μƒμœ„ μŠ€μ½”ν”„μΈ Global Execution Context 의 Lexical Environment λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

5. greet Function Execution Context - Execution Phase

greet ν•¨μˆ˜μ˜ Execution Context Creation Phase κ°€ λλ‚¬μœΌλ―€λ‘œ, μ½œμŠ€νƒμ— μŒ“μ΄κ³ , Execution Phase κ°€ μ‹œμž‘λ©λ‹ˆλ‹€.

  1. person : new Person(firstName, lastName) λ₯Ό 톡해 Person 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κ³ , person λ³€μˆ˜λŠ” ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

Β Β  ‼️ μŠ€μ½”ν”„ 체이닝 : μ‹λ³„μžλ₯Ό μ°ΎλŠ” κ³Όμ • ‼️
Β Β  1️⃣firstName κ³Ό lastName μ‹λ³„μžλŠ” ν˜„μž¬ greet ν•¨μˆ˜μ˜ Lexical Environment 에 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ,
Β Β  2️⃣greet ν•¨μˆ˜μ˜ Lexical Environment 의 [[Outer Env Reference]] μŠ¬λ‘―μ„ 톡해 μƒμœ„ Lexical Environment 인
Β Β  Global Execution Context 의 Lexical Environment 둜 μ˜¬λΌκ°‘λ‹ˆλ‹€.
Β Β  3️⃣Global Execution Context 의 Lexical Environment μ—μ„œ firstName κ³Ό lastName 을 찾을 수 μžˆμœΌλ―€λ‘œ,
Β Β  firstName κ³Ό lastName 은 각각 "λŒ€κ±΄" κ³Ό "κΉ€" 으둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.

  1. return createGreetingMessage : Heap μ˜μ—­μ— μƒμ„±λœ createGreetingMessage ν•¨μˆ˜ 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

6. Global Execution Context - Execution Phase (계속)

greet ν•¨μˆ˜μ˜ Execution Phase κ°€ λλ‚˜κ³ , sayHello λ³€μˆ˜μ— createGreetingMessage ν•¨μˆ˜ 객체가 λ°”μΈλ”©λ©λ‹ˆλ‹€.
console.log(sayHello()) λ₯Ό 톡해 sayHello ν•¨μˆ˜κ°€ 호좜되면, μƒˆλ‘œμš΄ Function Execution Context κ°€ μƒμ„±λ©λ‹ˆλ‹€.

7. createGreetingMessage Function Execution Context - Creation Phase

createGreetingMessage ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜κΈ°μœ„ν•΄ createGreetingMessage Function Execution Context 의 Creation Phase κ°€ μ‹œμž‘λ©λ‹ˆλ‹€.

createGreetingMessage ν•¨μˆ˜μ˜ Lexical Environment λŠ” greet ν•¨μˆ˜μ˜ Lexical Environment λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€. (‼️ 4-3 μ—μ„œ μƒμ„±λœ Closure)
이λ₯Ό 톡해 baseGreetMessage 와 person μ‹λ³„μžμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

8. createGreetingMessage Function Execution Context - Execution Phase

createGreetingMessage ν•¨μˆ˜μ˜ Execution Context Creation Phase κ°€ λλ‚¬μœΌλ―€λ‘œ, μ½œμŠ€νƒμ— μŒ“μ΄κ³ , Execution Phase κ°€ μ‹œμž‘λ©λ‹ˆλ‹€.

  1. baseGreetMessage : (‼️ 4-3 μ—μ„œ μƒμ„±λœ Closure λ₯Ό 톡해) greet ν•¨μˆ˜μ˜ Lexical Environment 에 μ ‘κ·Όν•˜μ—¬, baseGreetMessage λŠ” "μ•ˆλ…•ν•˜μ„Έμš”! " κ°€ λ©λ‹ˆλ‹€
  2. person : (‼️ 4-3 μ—μ„œ μƒμ„±λœ Closure λ₯Ό 톡해) greet ν•¨μˆ˜μ˜ Lexical Environment 에 μ ‘κ·Όν•˜μ—¬, person 은 Person 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  3. return \`${baseGreetMessage} ${person.getFullName()}\ : getFullName λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬, person μΈμŠ€ν„΄μŠ€μ˜ firstName κ³Ό lastName 을 κ°€μ Έμ™€μ„œ,
    ${baseGreetMessage} ${person.getFullName()} λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

console.log(sayHello()) μ—μ„œ createGreetingMessage ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ 값은 "μ•ˆλ…•ν•˜μ„Έμš”! λŒ€κ±΄ κΉ€" 이 λ©λ‹ˆλ‹€.

9. Global Execution Context - Execution Phase (계속)

  1. console : console μ‹λ³„μžλ₯Ό μ°ΎκΈ°μœ„ν•΄ Global Execution Context 의 Lexical Environment λ₯Ό μ°Έμ‘°ν•˜κ³ , μ΄λŠ” Global Object λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.
  2. log : console μ‹λ³„μžμ— λ°”μΈλ”©λœ Global Object 의 log λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
  3. sayHello() : createGreetingMessage ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ 값인 "μ•ˆλ…•ν•˜μ„Έμš”! λŒ€κ±΄ κΉ€" 을 인자둜 μ „λ‹¬ν•©λ‹ˆλ‹€.
  4. console.log(sayHello()) : "μ•ˆλ…•ν•˜μ„Έμš”! λŒ€κ±΄ κΉ€" 이 μ½˜μ†”μ— 좜λ ₯λ©λ‹ˆλ‹€.

πŸ“ 마무리

λ‹€μ‹œν•œλ²ˆ μ •λ¦¬ν•˜μžλ©΄,

  1. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” JavaScript 의 λ…λ¦½λœ μ‹€ν–‰ν™˜κ²½μΈ Realm
    Β Β  let, const, class μ‹λ³„μž 바인딩이 μ €μž₯λ˜λŠ” Lexical Environment
    Β Β  var, ν•¨μˆ˜ 선언문에 λŒ€ν•œ μ‹λ³„μž 바인딩이 μ €μž₯λ˜λŠ” Variable Environment
    Β Β  둜 κ΅¬μ„±λ©λ‹ˆλ‹€

  2. μ‹€ν–‰μ»¨ν…μŠ€νŠΈλŠ” 슀크립트 λ‘œλ“œ, ν•¨μˆ˜ μ‹€ν–‰μ‹œ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  λ©”λ‘œλ¦¬λ₯Ό μ˜ˆμ•½ν•˜λŠ” Creation Phase와
    Β Β  μ‹€μ œ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” Execution Phase λ₯Ό κ±°μΉœλ‹€ Β Β  μ΄λ•Œ, Creation Phase μ—μ„œ β€ΌοΈν˜Έμ΄μŠ€νŒ…β€ΌοΈ 이 λ°œμƒν•œλ‹€

  3. Environment Record λŠ” μƒμœ„ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ Environment Record λ₯Ό κ°€λ¦¬ν‚€λŠ” [[Outer Environment Reference]] κ°€ μ‘΄μž¬ν•œλ‹€

  4. Execution Phase μ—μ„œ ν˜„μž¬ μ‹€ν–‰μ»¨ν…μŠ€νŠΈμ˜ Environment Record μ—μ„œ μ‹λ³„μžλ₯Ό μ°Ύκ³ ,
    Β Β  μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 [[Outer Environment Reference]] λ₯Ό 톡해 μƒμœ„ μ‹€ν–‰μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹λ³„μžλ₯Ό μ°ΎλŠ”λ‹€ (β€ΌοΈμŠ€μ½”ν”„ 체인‼️)

  5. ν•¨μˆ˜ 내뢀에 λ‹€λ₯Έ ν•¨μˆ˜κ°€ μ •μ˜λœ 경우, λ‚΄λΆ€ ν•¨μˆ˜μ˜ Environment Record λŠ”
    Β Β  μƒμœ„ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ Environment Record λ₯Ό μΊ‘μ³ν•˜κ³ , [[Outer Environment Reference]] 둜 μ°Έμ‘°ν•œλ‹€ Β Β  이λ₯Ό 톡해, λ‚΄λΆ€ ν•¨μˆ˜λŠ” μƒμœ„ν•¨μˆ˜μ˜ Environment Record 에 μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€ (β€ΌοΈν΄λ‘œμ €β€ΌοΈ)