π€ Recap
μ΄μ κΈμμλ JavaScript μ€ν 컨ν
μ€νΈμ κ°λ
κ³Ό ꡬμ±μμ, Creation Phaseμ Execution Phaseμ λν΄ μμ보μμ΅λλ€.
βοΈ μ΄μ κΈ : JavaScript Execution Context μ€ν 컨ν μ€νΈ - κ°λ νΈ (feat. νΈμ΄μ€ν , μ€μ½ν 체μΈ, ν΄λ‘μ )
λ€μ νλ² μ 리νμλ©΄,

μ€ν 컨ν μ€νΈλ
- JavaScript μ½λκ° Isolate νκ² μ€νλλ νκ²½μ κ°λ¦¬ν€λ Realm
let
,const
,class
,ν¨μννμ
μ μν μλ³μ λ°μΈλ©μ μ μ₯νλ Lexical Environmentvar
,ν¨μμ μΈλ¬Έ
μ μν μλ³μ λ°μΈλ©μ μ μ₯νλ Variable Environment
μΌλ‘ ꡬμ±λμ΄ μκ³ ,
- μ€ν¬λ¦½νΈκ° μ€νλκ±°λ,
- ν¨μκ° νΈμΆλκ±°λ,
- λͺ¨λμ΄ λ‘λλ λ,
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 μμλ μλ³μλ€μ μ€μΊνμ¬ λ©λͺ¨λ¦¬ 곡κ°μ μμ½ν©λλ€.

message
:var
ν€μλλ‘ μ μΈλμμΌλ―λ‘,Variable Environment Record
μ λ±λ‘λκ³undefined
λ‘ μ΄κΈ°νλ©λλ€.firstName
:const
ν€μλλ‘ μ μΈλμμΌλ―λ‘,Lexical Environment Record
μ λ±λ‘λκ³Temporal Dead Zone(TDZ)
μνκ° λ©λλ€.
(μ΄λ λ³μμ μ κ·Όμ Reference Error λ°μ)lastName
:let
ν€μλλ‘ μ μΈλμμΌλ―λ‘,Lexical Environment Record
μ λ±λ‘λκ³Temporal Dead Zone(TDZ)
μνκ° λ©λλ€.
(μ΄λ λ³μμ μ κ·Όμ Reference Error λ°μ)Person
:class
ν€μλλ‘ μ μΈλμμΌλ―λ‘,Lexical Environment Record
μ λ±λ‘λκ³Temporal Dead Zone(TDZ)
μνκ° λ©λλ€.
(μ΄λ λ³μμ μ κ·Όμ Reference Error λ°μ)greet
:function declaration
μΌλ‘ μ μΈλμμΌλ―λ‘,Variable Environment Record
μ λ±λ‘λκ³ βΌοΈν¨μκ°μ²΄κ° Heap μμμ μμ±λ λ€ κ³§λ°λ‘ λ°μΈλ©βΌοΈ λ©λλ€.sayHello
:const
ν€μλλ‘ μ μΈλμμΌλ―λ‘,Lexical Environment Record
μ λ±λ‘λκ³Temporal Dead Zone(TDZ)
μνκ° λ©λλ€.
(μ΄λ λ³μμ μ κ·Όμ Reference Error λ°μ)
3. Global Execution Context - Execution Phase

Creation Phase κ° λλλ©΄, μ€μ μ½λκ° μ€νλλ Execution Phase κ° μ€νλ©λλ€
μμ±λ Global Execution Context λ μ½μ€νμ μμ΄κ³ , μ€νλ©λλ€.

message
: "μλ νμΈμ! " λ¬Έμμ΄μ΄ Heap μμμ μμ±λκ³ ,message
λ³μλ ν΄λΉ κ°μ κ°λ¦¬ν΅λλ€.firstName
: "λ건" λ¬Έμμ΄μ΄ Heap μμμ μμ±λκ³ ,firstName
λ³μλ ν΄λΉ κ°μ κ°λ¦¬ν΅λλ€.lastName
: "κΉ" λ¬Έμμ΄μ΄ Heap μμμ μμ±λκ³ ,lastName
λ³μλ ν΄λΉ κ°μ κ°λ¦¬ν΅λλ€.Person
: Person ν΄λμ€μ μμ±μ ν¨μμgetFullName
λ©μλκ° Heap μμμ μμ±λκ³ ,Person
μ νλ‘ν νμ 체μΈμ μ°κ²°λ©λλ€.greet
:greet
ν¨μλ Creation Phase μμ μ΄λ―Έ Heap μμμ μμ±λμμΌλ―λ‘ κ±΄λλλλ€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 κ° μμλ©λλ€.
baseGreetMessage
:[[Parameter]]
(λλ[[Arguments]]
) μ¬λ‘―μΌλ‘λΆν°baseGreetMessage
μ λν μλ³μ λ°μΈλ©μ΄Lexical Environment Record
μ μμ±λ©λλ€. (λ¨, ν¨μμ νλΌλ―Έν°λ Creation Phase μμ μ¦μ μΈμκ°μΌλ‘ μ΄κΈ°νλ©λλ€)person
:const
ν€μλλ‘ μ μΈλμμΌλ―λ‘,Lexical Environment Record
μ λ±λ‘λκ³Temporal Dead Zone(TDZ)
μνκ° λ©λλ€. (μ΄λ λ³μμ μ κ·Όμ Reference Error λ°μ)createGreetingMessage
: ν¨μ μ μΈλ¬Έμ΄λ―λ‘, greet Function Execution Context μVariable Environment
μ λ±λ‘λκ³ ,createGreetingMessage
ν¨μ κ°μ²΄κ° Heap μμμ μμ±λ©λλ€.
μ΄λ,createGreetingMessage
ν¨μμ[[Scope]]
(λλ ES6[[Environment]]
) μ¬λ‘―μgreet
ν¨μμ Lexical Environment λ₯Ό μ°Έμ‘°ν©λλ€. (βΌοΈ ν΄λ‘μ μμ± βΌοΈ)[[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 κ° μμλ©λλ€.

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
μ κ°κ° "λ건" κ³Ό "κΉ" μΌλ‘ μ΄κΈ°νλ©λλ€.
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 κ° μμλ©λλ€.

baseGreetMessage
: (βΌοΈ 4-3 μμ μμ±λ Closure λ₯Ό ν΅ν΄)greet
ν¨μμLexical Environment
μ μ κ·Όνμ¬,baseGreetMessage
λ "μλ νμΈμ! " κ° λ©λλ€person
: (βΌοΈ 4-3 μμ μμ±λ Closure λ₯Ό ν΅ν΄)greet
ν¨μμLexical Environment
μ μ κ·Όνμ¬,person
μPerson
ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν΅λλ€.return \`${baseGreetMessage} ${person.getFullName()}\
:getFullName
λ©μλλ₯Ό νΈμΆνμ¬,person
μΈμ€ν΄μ€μfirstName
κ³ΌlastName
μ κ°μ Έμμ,
${baseGreetMessage} ${person.getFullName()}
λ₯Ό λ°νν©λλ€.
console.log(sayHello())
μμ createGreetingMessage
ν¨μκ° λ°νν κ°μ "μλ
νμΈμ! λ건 κΉ" μ΄ λ©λλ€.
9. Global Execution Context - Execution Phase (κ³μ)

console
:console
μλ³μλ₯Ό μ°ΎκΈ°μν΄ Global Execution Context μLexical Environment
λ₯Ό μ°Έμ‘°νκ³ , μ΄λ Global Object λ₯Ό μ°Έμ‘°ν©λλ€.log
:console
μλ³μμ λ°μΈλ©λ Global Object μlog
λ©μλλ₯Ό νΈμΆν©λλ€.sayHello()
:createGreetingMessage
ν¨μκ° λ°νν κ°μΈ "μλ νμΈμ! λ건 κΉ" μ μΈμλ‘ μ λ¬ν©λλ€.console.log(sayHello())
: "μλ νμΈμ! λ건 κΉ" μ΄ μ½μμ μΆλ ₯λ©λλ€.
π λ§λ¬΄λ¦¬
λ€μνλ² μ 리νμλ©΄,
-
μ€ν 컨ν μ€νΈλ JavaScript μ λ 립λ μ€ννκ²½μΈ Realm
Β Βlet
,const
,class
μλ³μ λ°μΈλ©μ΄ μ μ₯λλ Lexical Environment
Β Βvar
,ν¨μ μ μΈλ¬Έ
μ λν μλ³μ λ°μΈλ©μ΄ μ μ₯λλ Variable Environment
Β Β λ‘ κ΅¬μ±λ©λλ€ -
μ€ν컨ν μ€νΈλ μ€ν¬λ¦½νΈ λ‘λ, ν¨μ μ€νμ μλ³μλ₯Ό λ±λ‘νκ³ λ©λ‘리λ₯Ό μμ½νλ Creation Phaseμ
Β Β μ€μ μ½λκ° μ€νλλ Execution Phase λ₯Ό κ±°μΉλ€ Β Β μ΄λ, Creation Phase μμ βΌοΈνΈμ΄μ€ν βΌοΈ μ΄ λ°μνλ€ -
Environment Record λ μμ μ€ν 컨ν μ€νΈμ Environment Record λ₯Ό κ°λ¦¬ν€λ [[Outer Environment Reference]] κ° μ‘΄μ¬νλ€
-
Execution Phase μμ νμ¬ μ€ν컨ν μ€νΈμ Environment Record μμ μλ³μλ₯Ό μ°Ύκ³ ,
Β Β μ‘΄μ¬νμ§ μλ κ²½μ° [[Outer Environment Reference]] λ₯Ό ν΅ν΄ μμ μ€ν컨ν μ€νΈμμ μλ³μλ₯Ό μ°Ύλλ€ (βΌοΈμ€μ½ν 체μΈβΌοΈ) -
ν¨μ λ΄λΆμ λ€λ₯Έ ν¨μκ° μ μλ κ²½μ°, λ΄λΆ ν¨μμ Environment Record λ
Β Β μμ ν¨μ μ€ν 컨ν μ€νΈμ Environment Record λ₯Ό μΊ‘μ³νκ³ , [[Outer Environment Reference]] λ‘ μ°Έμ‘°νλ€ Β Β μ΄λ₯Ό ν΅ν΄, λ΄λΆ ν¨μλ μμν¨μμ Environment Record μ μ κ·Ό κ°λ₯νλ€ (βΌοΈν΄λ‘μ βΌοΈ)