Skip to content

๐Ÿ“ฆ Execution Context โ€‹

01. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ž€? โ€‹

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ž€, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด(์Šค์ฝ”ํ”„, ๋ณ€์ˆ˜, this ๋“ฑ)๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์–ด๋–ค ์ˆœ์„œ๋กœ ์‹คํ–‰ํ• ์ง€, ๋ณ€์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์„์ง€, this๋Š” ๋ฌด์—‡์„ ๊ฐ€๋ฆฌํ‚ฌ์ง€ ๋“ฑ์„ ๊ฒฐ์ •ํ•œ๋‹ค.

  • ๊ฐ™์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ๋Š” ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•œ๋‹ค.
  • ์ปจํ…์ŠคํŠธ๊ฐ€ ์ „ํ™˜๋˜๋ฉด ์ƒˆ๋กœ์šด ์‹คํ–‰ ํ™˜๊ฒฝ์ด ๊ตฌ์„ฑ๋œ๋‹ค.

1-1. ์Šคํƒ๊ณผ ํ โ€‹

stack&queue ์Šคํƒ๊ณผ ํ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊บผ๋‚ด๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ตฌ๋ถ„๋˜๋Š” ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ(linear data structure).

์Šคํƒ (Stack) ๐Ÿฅž โ€‹

  • ๋ฐ์ดํ„ฐ๋ฅผ ์œ„๋กœ ์Œ“๋Š” ๊ตฌ์กฐ์ด๋‹ค
  • ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” LIFO (Last In, First Out) ๊ตฌ์กฐ์ด๋‹ค.
  • ๋Œ€ํ‘œ ๋ฉ”์„œ๋“œ: push(), pop()

ํ (Queue) ๐Ÿšถโ€โ™‚๏ธ๐Ÿšถโ€โ™€๏ธ๐Ÿšถโ€โ™‚๏ธ๐Ÿšถโ€โ™‚๏ธ โ€‹

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ค„ ์„ธ์›Œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.
  • ๊ฐ€์žฅ ๋จผ์ € ๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” FIFO (First In, First Out) ๊ตฌ์กฐ
  • ๋Œ€ํ‘œ ๋ฉ”์„œ๋“œ: push(), shift()

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• โ€‹

  • ์ „์—ญ ๊ณต๊ฐ„ (Global Context)
    : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์ฒ˜์Œ ๋กœ๋“œ๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค.
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ (Function Context)
    : ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
  • ๋ชจ๋“ˆ (Module)
    : ๋ชจ๋“ˆ์ด import๋˜๋Š” ์ˆœ๊ฐ„, ํ•ด๋‹น ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • eval() ์‚ฌ์šฉ ๋น„๊ถŒ์žฅ
    : ๋ฌธ์ž์—ด ์ฝ”๋“œ๋ฅผ ๋Ÿฐํƒ€์ž„์— ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ„๋„์˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์งˆ์ ์ธ ์ฝ”๋“œ ๋‹จ์œ„๋Š” ํ•จ์ˆ˜์ด๋‹ค.
๋”ฐ๋ผ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ๋‚˜๋‰œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก ๋ธ”๋ก ์Šค์ฝ”ํ”„ โ‰  ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์กฐ๊ฑด๋ฌธ์ด๋‚˜ ๋ฐ˜๋ณต๋ฌธ ๋“ฑ ๋ธ”๋ก๋ฌธ์€ ๋ธ”๋ก ์Šค์ฝ”ํ”„๋Š” ํ˜•์„ฑํ•˜์ง€๋งŒ, ๋ณ„๋„์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.



1-2. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ โ€‹

์•„๋ž˜ ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋”ฐ๋ผ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ œ๊ฑฐ๋˜๋Š” ํ๋ฆ„์„ ๋ณด์—ฌ์ค€๋‹ค.
์‹คํ–‰ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฝ˜์†” ์ถœ๋ ฅ ํ๋ฆ„์œผ๋กœ ๋ณด๋Š” ์‹คํ–‰ ๊ฒฐ๊ณผ โ€‹

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ

    1. outer() ํ•จ์ˆ˜ ํ˜ธ์ถœ
    1. ๋‚ด๋ถ€์—์„œ inner() ํ˜ธ์ถœ
    1. inner() ์ข…๋ฃŒ ํ›„ ๋‹ค์‹œ outer() ๋‚ด๋ถ€ ์ง„ํ–‰
    1. ๋ชจ๋“  ์‹คํ–‰์ด ๋๋‚˜๊ณ  ์ „์—ญ์—์„œ ๋งˆ์ง€๋ง‰ console.log(a)

๐Ÿ” ์•„๋ž˜์—์„œ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ํ™•์ธํ•ด๋ณด์ž.


์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ ์‹œ๊ฐํ™” โ€‹

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ์ฝœ ์Šคํƒ(Call Stack)์— ์Œ“์•„ ์‹คํ–‰ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•œ๋‹ค.

  • ์ฝ”๋“œ ์‹คํ–‰ ์‹œ ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์ฝœ ์Šคํƒ์— ์ง„์ž…ํ•œ๋‹ค.
  • ์ดํ›„ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์ฝœ ์Šคํƒ์— push๋œ๋‹ค.
  • ํ•จ์ˆ˜ ์‹คํ–‰์ด ๋๋‚˜๋ฉด ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋Š” ์ฝœ ์Šคํƒ์—์„œ pop๋˜์–ด ์ œ๊ฑฐ๋˜๋ฉฐ, ์ด์ „ ์ปจํ…์ŠคํŠธ๋กœ ๋ณต๊ท€ํ•œ๋‹ค.

๐Ÿ’ก ํ๋ฆ„ ์ •๋ฆฌ

  • outer()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ฝœ ์Šคํƒ์˜ ๋งจ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ , ์ „์—ญ ์ปจํ…์ŠคํŠธ ์‹คํ–‰์€ ์ผ์‹œ ์ •์ง€๋œ๋‹ค.
  • outer() ๋‚ด๋ถ€์—์„œ inner()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ๋˜ ๋‹ค์‹œ inner์˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์Šคํƒ์˜ ๋งจ ์œ„์— ์˜ฌ๋ผ๊ฐ„๋‹ค.
  • inner() ์‹คํ–‰์ด ๋๋‚˜๋ฉด pop โ†’ ๋‹ค์‹œ outer() โ†’ pop โ†’ ๋‹ค์‹œ ์ „์—ญ ์ปจํ…์ŠคํŠธ ์‹คํ–‰.

์ฆ‰, ์ฝœ ์Šคํƒ์˜ ๋งจ ์œ„์— ์žˆ๋Š” ์ปจํ…์ŠคํŠธ๋งŒ ์‹คํ–‰ ์ค‘์ด๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋Œ€๊ธฐ ์ƒํƒœ์ด๋‹ค.


์ฝœ ์Šคํƒ์˜ ๋ณ€ํ™” ๊ณผ์ • โ€‹

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฝœ ์Šคํƒ์— pushํ•œ๋‹ค.
  • ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด ์ฝœ ์Šคํƒ์—์„œ pop๋˜์–ด ์ œ๊ฑฐ๋˜๋ฉฐ, ์ด์ „ ์ปจํ…์ŠคํŠธ๋กœ ๋ณต๊ท€ํ•œ๋‹ค.
  • ์ฝœ ์Šคํƒ์ด ๋ฌดํ•œํžˆ ์Œ“์ด๋ฉด Maximum call stack size exceeded ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์Šคํƒ๊ณผ ์ฝœ ์Šคํƒ์˜ ์ฐจ์ด๋Š”?

  • ์Šคํƒ(Stack): ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๊ณ  ๊บผ๋‚ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฐœ๋…์ด๋‹ค.
  • ์ฝœ ์Šคํƒ(Call Stack):์Šคํƒ ๊ฐœ๋…์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜ ์‹คํ–‰ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉ๋œ ์‹œ์Šคํ…œ ๊ตฌ์กฐ์ด๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์— push๋˜๊ณ , ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋ฉด pop๋˜์–ด ์ œ๊ฑฐ๋œ๋‹ค.

์ฆ‰, ์Šคํƒ์€ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฐœ๋…์ด๊ณ  ์ฝœ ์Šคํƒ์€ ๊ทธ ๊ฐœ๋…์ด ์‹ค์ œ ํ•จ์ˆ˜ ์‹คํ–‰ ํ๋ฆ„ ๊ด€๋ฆฌ์— ์ ์šฉ๋œ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ์ด๋‹ค.


02. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€ ๊ตฌ์กฐ โ€‹

ํ™œ์„ฑํ™”๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ˆ˜์ง‘ ์ •๋ณด

Execution Context ๊ตฌ์„ฑ ์š”์†Œ โ€‹

  • ๐Ÿ—ณ๏ธ Variable Environment
    : ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ ์‹๋ณ„์ž ์ •๋ณด์™€ ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•œ๋‹ค.
    ์„ ์–ธ ์‹œ์ ์˜ Lexical Environment์˜ ๐Ÿ“ธ์Šค๋ƒ…์ƒท์œผ๋กœ, ์ดํ›„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค.

  • ๐Ÿ—ณ๏ธ Lexical Environment
    : ์ดˆ๊ธฐ์—๋Š” Variable Environment์™€ ๋™์ผํ•˜์ง€๋งŒ,
    ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋˜๋ฉฐ ๋ณ€์ˆ˜ ๊ฐ’ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๐Ÿ”— This Binding
    : ํ•ด๋‹น ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ this๊ฐ€ ์ฐธ์กฐํ•ด์•ผ ํ•  ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.


๐Ÿ“Ž Dmitry Soshnikov์˜ Lexical Environment
ES5 ์‚ฌ์–‘์— ๊ธฐ๋ฐ˜์œผ๋กœ Lexical Environment ๊ฐœ๋…์„ JS ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์„ค๋ช…ํ•œ ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ. ใ€Ž์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธใ€๋„ ์ด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์„ค๋ช…์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.


03. VariableEnvironment โ€‹

VariableEnvironment ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, Variable Environment์— ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•œ ๋’ค,
๊ทธ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด Lexical Environment๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.


์ดํ›„์—๋Š” ์ฃผ๋กœ Lexical Environment๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋‘ ๊ตฌ์กฐ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋‘ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณตํ†ต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

less
Execution Context
โ”œโ”€โ”€ ๐Ÿ—ณ๏ธ Variable Environment
โ”‚   โ”œโ”€โ”€ Environment Record(snapshot)
โ”‚   โ””โ”€โ”€ Outer Environment Reference(snapshot)
โ”‚
โ”œโ”€โ”€ ๐Ÿ—ณ๏ธ Lexical Environment
โ”‚   โ”œโ”€โ”€ Environment Record
โ”‚   โ””โ”€โ”€ Outer Environment Reference
โ”‚
โ””โ”€โ”€ ๐Ÿ”— This Binding

04. LexicalEnvironment โ€‹

LexicalEnvironment

Lexical Environment๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” 'ํ™˜๊ฒฝ ์ •๋ณด๋“ค์˜ ์ง‘ํ•ฉ ๊ฐ์ฒด'์ด๋‹ค.
์‹คํ–‰ ์ค‘ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”์ ํ•˜๋Š” ํ•ต์‹ฌ ๊ตฌ์กฐ๋‹ค.
๐Ÿ’ก ์ด ๊ตฌ์กฐ๋Š” ํด๋กœ์ €, ์Šค์ฝ”ํ”„ ์ฒด์ธ, this ๋ฐ”์ธ๋”ฉ ๋™์ž‘ ๋ฐฉ์‹์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜์ด ๋œ๋‹ค!

  • Environment Record: ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ ์‹๋ณ„์ž ์ •๋ณด(๋ณ€์ˆ˜, ํ•จ์ˆ˜ ๋“ฑ)
  • Outer Environment Reference: ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ์ฐธ์กฐํ•ด '์Šค์ฝ”ํ”„ ์ฒด์ธ'์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์—ฐ๊ฒฐ ์ •๋ณด


4-1. EnvironmentRecord์™€ ํ˜ธ์ด์ŠคํŒ… โ€‹

Environment Record๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์‹๋ณ„์ž ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ์—”์ง„์€ ์ด ์ •๋ณด๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์ˆ˜์ง‘ํ•˜๋ฉฐ ์ด ๊ณผ์ •์„ ํ”ํžˆ ํ˜ธ์ด์ŠคํŒ…(Hoisting)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๐Ÿ’ก ํ˜ธ์ด์ŠคํŒ…์€ ์‹ค์ œ ์ฝ”๋“œ ์ด๋™์ด ์•„๋‹Œ, ์‹๋ณ„์ž ์ •๋ณด๊ฐ€ ๋ฏธ๋ฆฌ ๋“ฑ๋ก๋˜๋Š” ํ˜„์ƒ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋…์  ํ‘œํ˜„์ด๋‹ค.


๐Ÿ” ํ˜ธ์ด์ŠคํŒ… ๊ทœ์น™ โ€‹

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ด์ŠคํŒ…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  EnvironmentRecord์— ์‹๋ณ„์ž๋“ค์„ ๋‹ค์Œ ์ˆœ์„œ๋Œ€๋กœ ์‚ฌ์ „์— ๋“ฑ๋กํ•œ๋‹ค.

    1. ๋งค๊ฐœ๋ณ€์ˆ˜ x โ†’ ์ธ์ž 1๊ณผ ๋ฐ”์ธ๋”ฉ๋˜์–ด x: 1๋กœ ๋“ฑ๋ก
    1. var x; ์„ ์–ธ โ†’ ์ด๋ฏธ x๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ค‘๋ณต ์„ ์–ธ์€ ๋ฌด์‹œ
    1. var x = 2 โ†’ ์„ ์–ธ์€ ๋ฌด์‹œ๋˜๊ณ , ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ x = 2 ํ• ๋‹น๋งŒ ์ ์šฉ

๋”ฐ๋ผ์„œ ์ตœ์ข…์ ์œผ๋กœ EnvironmentRecord์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ x ํ•˜๋‚˜๋งŒ ๋“ฑ๋ก๋˜๊ณ ,
๋ชจ๋“  var ์„ ์–ธ์€ ๋ฌด์‹œ๋˜๋ฉฐ, ์ดํ›„ ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ x = 2๋งŒ ์žฌํ• ๋‹น๋œ๋‹ค.


ํ•จ์ˆ˜ ์„ ์–ธ์˜ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜ ์„ ์–ธ์˜ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ๋ณ€์ˆ˜ ์„ ์–ธ๋ณด๋‹ค ๋จผ์ € EnvironmentRecord์— ๋“ฑ๋ก๋˜๋ฉฐ, ์„ ์–ธ๊ณผ ๋™์‹œ์— ํ•จ์ˆ˜ ์ „์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

    1. function b() โ†’ ํ•จ์ˆ˜ ์„ ์–ธ์ด ๊ฐ€์žฅ ๋จผ์ € ์ˆ˜์ง‘ โ†’ b: function b() {}๋กœ ๋“ฑ๋ก
    1. var b โ†’ ์ด๋ฏธ b๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ค‘๋ณต ์„ ์–ธ์€ ๋ฌด์‹œ
    1. ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ b = bbb ํ• ๋‹น โ†’ ๊ธฐ์กด ํ•จ์ˆ˜๊ฐ€ ๋ฌธ์ž์—ด๋กœ ๋ฎ์–ด์”Œ์›Œ์ง

์ฆ‰, function b()๋Š” ์‹คํ–‰ ์ „์— ์ด๋ฏธ EnvironmentRecord์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๊ณ , ์ดํ›„ b = 'bbb'๊ฐ€ ์‹คํ–‰๋˜๋ฉด, ํ•ด๋‹น ์‹๋ณ„์ž์˜ ๊ฐ’๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค.


Environment Record ์ •๋ฆฌ

Environment Record

์‹๋ณ„์ž function a, var b, var c ํ˜ธ์ด์ŠคํŒ… ๊ฒฐ๊ณผ :

  • function a: ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์ „์ฒด๊ฐ€ ํ˜ธ์ด์ŠคํŒ… ๋œ๋‹ค(๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค).
  • var b, var c: ๋ณ€์ˆ˜ ์„ ์–ธ๋งŒ ๋Œ์–ด์˜ฌ๋ ค์ง€๊ณ , ๊ฐ’์€ undefined๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋Œ์–ด์˜ฌ๋ ค์ง„ ์‹๋ณ„์ž ์ •๋ณด๋“ค์ด Environment Record์— ์ €์žฅ๋œ๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ˜„์žฌ ์Šค์ฝ”ํ”„์— ์–ด๋–ค ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์ˆ˜์ง‘ํ•˜๋Š”๋ฐ,
์ด ๊ณผ์ • ๋•Œ๋ฌธ์—, ๋งˆ์น˜ ์ฝ”๋“œ์˜ ์„ ์–ธ๋ถ€๋งŒ ์ฝ”๋“œ ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ผ๊ฐ„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹ โ€‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด ์žˆ๋‹ค. ์ด ๋‘˜์€ ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹์—์„œ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋‹ค.

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ(Function Declaration) โ€‹

js
// ํ•จ์ˆ˜๋ช… a๊ฐ€ ๊ณง ๋ณ€์ˆ˜๋ช…
function a() {...}
a();
  • function a()๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ์‹œ EnvironmentRecord์— ์ „์ฒด ํ•จ์ˆ˜๊ฐ€ ๋“ฑ๋ก๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์„ ์–ธ ์ด์ „์—๋„ ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ์„ ์–ธ์€ ๋ณ€์ˆ˜ ์„ ์–ธ๋ณด๋‹ค๋„ ๋จผ์ € ์ˆ˜์ง‘๋œ๋‹ค.

๐Ÿ’ก ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ

์ฝ”๋“œ ์ƒ ์œ„์น˜์™€ ๊ด€๊ณ„์—†์ด, ๊ฐ€์žฅ ๋จผ์ € EnvironmentRecord์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.


ํ•จ์ˆ˜ ํ‘œํ˜„์‹(Function Expression) โ€‹

js
// ์ต๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹: ๋ณ€์ˆ˜๋ช… b๊ฐ€ ๊ณง ํ•จ์ˆ˜๋ช…
var b = function(){...}
b();

// ๊ธฐ๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹: ๋ณ€์ˆ˜๋ช…์€ c, ํ•จ์ˆ˜๋ช…์€ d
var c = function d(){...}
c()
d() // ReferenceError
  • var๋กœ ์„ ์–ธํ•œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ์„ ์–ธ๋งŒ ํ˜ธ์ด์ŠคํŒ…๋˜๊ณ , ๊ฐ’์€ undefined
  • let ๋˜๋Š” const๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, TDZ(Temporal Dead Zone)์— ๊ฑธ๋ ค ์„ ์–ธ ์ „์— ์ ‘๊ทผํ•˜๋ฉด ReferenceError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • function d()์ฒ˜๋Ÿผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ด๋ฆ„์„ ๋ถ™์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ด๋ฆ„์€ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์™ธ๋ถ€์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•˜๋‹ค.
  • ๊ธฐ๋ช… ํ‘œํ˜„์‹์€ ๋””๋ฒ„๊น… ์Šคํƒ ์ถ”์  ๋˜๋Š” ๋‚ด๋ถ€ ์žฌ๊ท€ ํ˜ธ์ถœ์šฉ ์ด๋ฆ„ ๋ถ€์—ฌ์— ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

์˜ˆ์ œ ๋น„๊ต โ€‹

์›๋ณธ ์ฝ”๋“œ

js
// ์›๋ณธ ์ฝ”๋“œ
console.log(sum(1, 2));
console.log(multiply(3, 4));

// ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ sum
function sum(a, b) {
  return a + b;
}

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹ multiply
var multiply = function (a, b) {
  return a * b;
};

ํ˜ธ์ด์ŠคํŒ… ์ดํ›„์˜ ๊ฐœ๋…์  ์ฝ”๋“œ ์˜ˆ์‹œ

js
// ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ์ „์ฒด ํ•จ์ˆ˜๊ฐ€ ๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค.
// ๋น„์œ ์  ์˜ˆ์‹œ
var sum = function sum(a, b) {
  return a + b;
};

// ์‹ค์ œ๋กœ๋Š” sum์ด๋ผ๋Š” ์ด๋ฆ„์ด EnvironmentRecord์— ๋ฐ”์ธ๋”ฉ๋˜๊ณ ,
// ๊ทธ ๊ฐ’์œผ๋กœ ์ „์ฒด ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ. sum: <function object>
// function sum(a, b) {
//   return a + b;
// }

var multiply; // ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ถ€๋งŒ ๋Œ์–ด์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

console.log(sum(1, 2));
console.log(multiply(3, 4)); // TypeError: multiply is not a function

// ๋ณ€์ˆ˜์˜ ํ• ๋‹น๋ถ€๋Š” ์›๋ž˜ ์ž๋ฆฌ์— ๋‚จ๊ฒจ๋‘๊ณ  ์‹ค์ œ ํ•จ์ˆ˜ ํ• ๋‹น์€ ์—ฌ๊ธฐ์„œ ์ด๋ค„์ง
multiply = function (a, b) {
  return a * b;
};


4-2. Outer Environment Reference โ€‹

Outer Environment Reference

Outer Environment Reference๋ž€ ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด ์™ธ๋ถ€ ํ™˜๊ฒฝ์„ ์ฐธ์กฐํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ์ฆ‰, ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์— ์กด์žฌํ•˜์ง€ ์•Š์€ ์‹๋ณ„์ž๋ฅผ ์ฐพ์„ ๋•Œ, ์ด ์ฐธ์กฐ๋ฅผ ๋”ฐ๋ผ ์™ธ๋ถ€ ํ™˜๊ฒฝ(Lexical Environment)์„ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ, ์—†๋Š” ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋Š” Outer Environment Reference๋ฅผ ํ†ตํ•ด ๋ฐ”๊นฅ Lexical Environment๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ๋งŒ์•ฝ ๊ฑฐ๊ธฐ์„œ๋„ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋ฉด, ๋” ๋ฐ”๊นฅ์˜ ํ™˜๊ฒฝ์œผ๋กœ ๊ณ„์†ํ•ด์„œ ํƒ์ƒ‰ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์ฐธ์กฐ ๊ตฌ์กฐ์— ์˜ํ•ด ์Šค์ฝ”ํ”„ ์ฒด์ธ(Scope Chain) ์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.


Scope Chain โ€‹

Outer Environment Reference

inner ์ปจํ…์ŠคํŠธ๋Š” ์ž์‹ ์˜ Environment Record ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ,
Outer Environment Reference๋ฅผ ํ†ตํ•ด outer์™€ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ Lexical Environment๊นŒ์ง€ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ” ํ๋ฆ„์œผ๋กœ ์ดํ•ดํ•˜๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ธ

inner์—์„œ ์‹๋ณ„์ž๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์„ ๋”ฐ๋ฅธ๋‹ค:

  1. ์ž์‹ ์˜ Environment Record์—์„œ ์‹๋ณ„์ž๋ฅผ ์ฐพ๋Š”๋‹ค.
  2. ์—†์œผ๋ฉด Outer Environment Reference๋ฅผ ๋”ฐ๋ผ outer์˜ Lexical Environment๋กœ ์ด๋™ํ•ด ํƒ์ƒ‰ํ•œ๋‹ค.
  3. ๊ทธ๋ž˜๋„ ์—†์œผ๋ฉด ๋‹ค์‹œ Outer Environment Reference๋ฅผ ๋”ฐ๋ผ ์ „์—ญ Lexical Environment๊นŒ์ง€ ํƒ์ƒ‰ํ•œ๋‹ค.

์ด์ฒ˜๋Ÿผ ๊ฐ€๊นŒ์šด ์Šค์ฝ”ํ”„๋ถ€ํ„ฐ ๋ฐ”๊นฅ ์Šค์ฝ”ํ”„๋กœ ์ ์ง„์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๐Ÿ”—์Šค์ฝ”ํ”„ ์ฒด์ธ์ด๋ผ๊ณ  ํ•œ๋‹ค.


๐Ÿ’ก Scope & Scope Chain ์š”์•ฝ

Scope โ€‹

  • ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.
  • ๋ณ€์ˆ˜๋Š” ์ž์‹ ์ด ์ •์˜๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋‚ด๋ถ€(์ž์‹)์Šค์ฝ”ํ”„๋Š” ์™ธ๋ถ€(๋ถ€๋ชจ) ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์™ธ๋ถ€ ์Šค์ฝ”ํ”„๋Š” ๋‚ด๋ถ€ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
    โ†’ ์™ธ๋ถ€์—์„œ๋Š” inner์˜ Lexical Environment๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Scope Chain โ€‹

  • ํ˜„์žฌ ์Šค์ฝ”ํ”„์—์„œ ์‹๋ณ„์ž๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๋•Œ, Outer Environment Reference๋ฅผ ๋”ฐ๋ผ ๋ฐ”๊นฅ ์Šค์ฝ”ํ”„๋ฅผ ์ฐจ๋ก€๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค.

Shadowing โ€‹

  • ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์Šค์ฝ”ํ”„์— ๋™์ผํ•œ ์ด๋ฆ„์˜ ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•˜๋ฉด, ๊ทธ ์‹๋ณ„์ž๊ฐ€ ์šฐ์„  ์‚ฌ์šฉ๋˜๊ณ  ๋ฐ”๊นฅ ์‹๋ณ„์ž๋Š” ๊ฐ€๋ ค์ง„๋‹ค.
  • ์ด์ฒ˜๋Ÿผ ๊ฐ€๊นŒ์šด ์„ ์–ธ์ด ์šฐ์„ ํ•˜๋Š” ํ˜„์ƒ์„ Shadowing์ด๋ผ๊ณ  ํ•œ๋‹ค.