๐Ÿ’ก Execution Context๋ž€?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”ย ํ™˜๊ฒฝ์„ ์ถ”์ƒํ™”ํ•œ ๊ฐ์ฒด์ด๋‹ค. ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ ๋•Œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„ ๋†“์€ ๊ฐ์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋งŒ๋“ ๋‹ค
2. ๊ทธ ์•ˆ์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค

์—”์ง„์€ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ƒฅ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  โ€œ์‹คํ–‰ ํ™˜๊ฒฝโ€์„ ๋จผ์ € ๋งŒ๋“  ๋‹ค์Œ ๊ทธ ์•ˆ์—์„œ ์‹คํ–‰ํ•œ๋‹ค.

์ด ํ™˜๊ฒฝ์ด ๋ฐ”๋กœ Execution Context๋‹ค.




๐Ÿ“ฆ Execution Context ์ข…๋ฅ˜

  • Global Execution Context (์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ)
    • ์ฝ”๋“œ๊ฐ€ ์ฒ˜์Œ ์‹คํ–‰๋  ๋•Œ ์ƒ์„ฑํ•œ๋‹ค.
  • Function Execution Context (ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ)
    • ํ•จ์ˆ˜ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑํ•œ๋‹ค.
  • Eval Execution Context (eval ์‹คํ–‰ ์ปจํ…์ŠคํŠธ)
    • eval ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‹คํ–‰๋œ๋‹ค.

์‹คํ–‰ ํ๋ฆ„

1. Global Execution Context ์ƒ์„ฑ
2. ๋ณ€์ˆ˜/ํ•จ์ˆ˜ ๋“ฑ๋ก
3. ํ•จ์ˆ˜ ํ˜ธ์ถœ โ†’ Function Execution Context ์ƒ์„ฑ
4. ์‹คํ–‰ ํ›„ ์‚ฌ๋ผ์ง



๐Ÿง  Execution Context ๋‚ด๋ถ€ ๊ตฌ์กฐ

Lexical Environment

  • let / const
  • ํ•จ์ˆ˜ ์„ ์–ธ
  • ๋ธ”๋ก ์Šค์ฝ”ํ”„ ์ •๋ณด / ์ƒ์œ„ ์Šค์ฝ”ํ”„ ์ฐธ์กฐ

Variable Environment

  • var ์ „์šฉ ์ €์žฅ์†Œ (์ดˆ๊ธฐ JS ํ˜ธํ™˜์šฉ ๊ฐœ๋…)

This Binding

  • ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ์˜ this ๊ฐ’



๐Ÿ”ฅ Execution Context๋Š” 2๋‹จ๊ณ„๋กœ ์ƒ์„ฑ๋œ๋‹ค

Execution Context๋Š” ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•œ ํ™˜๊ฒฝ์ด๋ฉฐ, ์ƒ์„ฑ ๋‹จ๊ณ„์—์„œ ๋ณ€์ˆ˜/ํ•จ์ˆ˜ ์„ ์–ธ์ด ๋“ฑ๋ก๋˜๊ณ , ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ ์ฝ”๋“œ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค.

Creation Phase (์ƒ์„ฑ ๋‹จ๊ณ„)

  • ์—”์ง„์ด ์•„์ง ์ฝ”๋“œ ์‹คํ–‰ ์•ˆ ํ•œ ๋‹จ๊ณ„์—์„œ ๋ณ€์ˆ˜ ์„ ์–ธ, ํ•จ์ˆ˜ ์„ ์–ธ, this ๊ฒฐ์ •์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ฑ๋กํ•œ๋‹ค.
  • ์ด ๋‹จ๊ณ„ ๋•Œ๋ฌธ์— Hoisting์ด ์ƒ๊ธด๋‹ค.

Execution Phase (์‹คํ–‰ ๋‹จ๊ณ„)

  • ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ์‹คํ–‰ํ•˜๊ณ  ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.



๐Ÿ’ก Hoisting์ด๋ž€?

โ€œ์„ ์–ธ์ด ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ˜„์ƒโ€

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” Creation Phase์—์„œ ์„ ์–ธ์ด ๋ฏธ๋ฆฌ ๋“ฑ๋ก๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ๋ณด์ด๋Š” ๊ฒƒ์ด๋‹ค.


๐Ÿ”Ž var์˜ ๊ฒฝ์šฐ: undefined ์ถœ๋ ฅ

console.log(a);
var a = 10;

1. Global Execution Context ์ƒ์„ฑ

Creation Phase๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์—”์ง„์€ var a๋ฅผ Variable Environment์— ๋“ฑ๋กํ•˜๊ณ  ์ดˆ๊ธฐ๊ฐ’์„ undefined๋กœ ์„ธํŒ…ํ•œ๋‹ค.

// ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ
a: undefined

2. Execution Phase ์‹œ์ž‘ : ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋œ๋‹ค.

// ์ฒซ๋ฒˆ์งธ ์ค„
console.log(a);

์—”์ง„์€ Execution Context์˜ Variable Environment์—์„œ ๊ฐ’์ด undefined์ธ a๋ฅผ ์ฐพ์•„์„œ undefined๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

// ๋‘๋ฒˆ์งธ ์ค„
var a = 10;

์ด๋ฏธ a๋Š” ์กด์žฌํ–ˆ์œผ๋ฏ€๋กœ ์—”์ง„์€ a ์— 10 ์ด๋ผ๋Š” ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.


๐Ÿ”Žย let & const์˜ ๊ฒฝ์šฐ: ReferenceError ๋ฐœ์ƒ

1. Global Execution Context ์ƒ์„ฑ

Creation Phase๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์—”์ง„์€ let a๋ฅผ Lexical Environment์— ๋“ฑ๋กํ•˜์ง€๋งŒ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ์ƒํƒœ๋ฅผ TDZ (Temporal Dead Zone) ๋ผ๊ณ  ํ•œ๋‹ค.

// ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ
a: <uninitialized>

2. Execution Phase ์‹œ์ž‘ : ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋œ๋‹ค.

// ์ฒซ๋ฒˆ์งธ ์ค„
console.log(a);

์—”์ง„์€ ์กด์žฌ๋Š” ํ•˜์ง€๋งŒ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ a๋กœ ์ธํ•ด์„œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.


๊ตฌ๋ถ„ var let
๋“ฑ๋ก ์œ„์น˜ Variable Environment Lexical Environment
Creation Phase ์ดˆ๊ธฐํ™” undefined ์ดˆ๊ธฐํ™” ์•ˆ ๋จ
์ดˆ๊ธฐํ™” ์ „ ์ ‘๊ทผ undefined ์ถœ๋ ฅ ReferenceError

๐Ÿ”Ž ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ: ํ˜ธ์ถœ ๊ฐ€๋Šฅ

foo();

function foo() {
  console.log("hello");
}

1. Creation Phase ์‹œ์ž‘ :

foo: function object

์ด๋ฏธ ํ•จ์ˆ˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ฑ๋ก๋˜๊ธฐ์— ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ”Ž ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ: ์—๋Ÿฌ ๋ฐœ์ƒ

foo();

var foo = function () {
  console.log("hello");
};

1. Creation Phase๋ฅผ ์‹คํ–‰ํ•œ๋‹ค :

foo: undefined

2. Execution Phase ์‹œ์ž‘ : ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋œ๋‹ค.

// ์ฒซ๋ฒˆ์งธ ์ค„
foo(); โ†’ undefined is not a function โŒ

์™œ๋ƒ๋ฉด ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ์•„์ง ํ• ๋‹น ์•ˆ ๋๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ๋œ๋‹ค.




๐Ÿ”Žย ์กฐ๊ธˆ ๋” ๋ณต์žกํ•œ ์˜ˆ์ œ

var a = 1;

function test() {
  console.log(a);
  var a = 2;
}

test();

1. ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘

JS๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋จผ์ € Global Execution Context๋ฅผ ๋งŒ๋“ ๋‹ค.

a: undefined
test: function object

1. Global Creation Phase

  • var a ๋“ฑ๋ก โ†’ a: undefined
  • function test ๋“ฑ๋ก โ†’ ํ•จ์ˆ˜ ๊ฐ์ฒด๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ

2. Global Execution Phase (์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ์‹คํ–‰ํ•œ๋‹ค)

  • var a = 1 : ์ด๋ฏธ a๋Š” ์กด์žฌํ•˜๋ฏ€๋กœ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•œ๋‹ค

    a = 1
    
  • test() ํ˜ธ์ถœ


2. test() ํ˜ธ์ถœ

1. Function Execution Context ์ƒ์„ฑ

  • test()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ƒˆ๋กœ์šด Function Execution Context๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

2. test ํ•จ์ˆ˜์˜ Creation Phase

a: undefined
  • ์—”์ง„์ด ๋จผ์ € ๋‚ด๋ถ€ ์„ ์–ธ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • var a ๋“ฑ๋ก โ†’ a: undefined
  • ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ์ด a๋Š” global a์™€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

3. test ํ•จ์ˆ˜ Execution Phase (์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ์‹คํ–‰ํ•œ๋‹ค)

  • console.log(a) :

    • ์—”์ง„์€ a๋ฅผ ์ฐพ๋Š”๋‹ค
    • ํƒ์ƒ‰ ์ˆœ์„œ:
      • test ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์—์„œ a๋ฅผ ๋ฐœ๊ฒฌํ•œ๋‹ค (undefined)
      • ๊ทธ๋ž˜์„œ global๊นŒ์ง€ ๊ฐ€์ง€ ์•Š๋Š”๋‹ค
    • ์ถœ๋ ฅ: undefined
  • var a = 2 :

    a = 2
    

    ์ด๋ฏธ a๋Š” ์กด์žฌํ•˜๋ฏ€๋กœ ๊ฐ’๋งŒ ํ• ๋‹นํžŒ๋‹ค


3. test() ์ข…๋ฃŒ

Function Execution Context๊ฐ€ Call Stack์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.




๐Ÿงถ ์ „์ฒด ํ๋ฆ„ ์ •๋ฆฌ

GlobalExecutionContext ์ƒ์„ฑ
   โ†“GlobalCreationPhase
   -a:undefined
   -test:function
   โ†“GlobalExecutionPhase
   - a =1
   -test() ํ˜ธ์ถœ
       โ†“FunctionExecutionContext ์ƒ์„ฑ
           โ†“CreationPhase
           -a:undefined
           โ†“ExecutionPhase
           -console.log(a) โ†’undefined
           - a =2
       โ†“
       ํ•จ์ˆ˜ ์ข…๋ฃŒ โ†’ ์ œ๊ฑฐ