JavaScript๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ์ด๋Ÿฐ ์˜๋ฌธ์ด ์ƒ๊ฒผ๋‹ค.

  • ๋ณ€์ˆ˜๋Š” ๋„๋Œ€์ฒด ์–ด๋””์— ์ €์žฅ๋ ๊นŒ?
  • ํ•จ์ˆ˜ ์•ˆ์—์„œ ์™œ ๋ฐ”๊นฅ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?
  • JavaScript ์—”์ง„์€ ๋ณ€์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์•„๋‚ผ๊นŒ?

๊ทธ ๋‹ต์€ Lexical Environment์™€ Scope Chain์„ ํ†ตํ•ด ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.




๐Ÿ’ก Lexical Environment๋ž€?

ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€์ˆ˜ ์ €์žฅ ๊ณต๊ฐ„ + ์ƒ์œ„ ์Šค์ฝ”ํ”„ ์ฐธ์กฐ ์ •๋ณด

JavaScript๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ Execution Context๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Execution Context๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Lexical Environment๊ฐ€ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค.

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

Execution Context
โ”œโ”€ Lexical Environment
โ”œโ”€ Variable Environment
โ””โ”€ This Binding

์—ฌ๊ธฐ์„œ ๋ณ€์ˆ˜ ํƒ์ƒ‰์˜ ํ•ต์‹ฌ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Lexical Environment๋‹ค.

๐Ÿ“ฆ Lexical Environment ๋‚ด๋ถ€ ๊ตฌ์กฐ

Lexical Environment
โ”œโ”€ Environment Record
โ””โ”€ Outer Reference

Lexical Environment๋Š” ๋‘ ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

1. Environment Record : ํ˜„์žฌ ์Šค์ฝ”ํ”„์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.

function test() {
  let a = 10;
}

Environment Record๋Š” a: 10์ด๋‹ค. ์ฆ‰, ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜ ๋ชฉ๋ก์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

2. Outer Reference : ํ˜„์žฌ ์Šค์ฝ”ํ”„์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋‹ค.

์ด ์ฐธ์กฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋ฉด์„œ JavaScript์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ตฌ์กฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š”๋ฐ, ์ด๊ฒŒ ๋ฐ”๋กœ Scope Chain์ด๋‹ค.


์™œ ์ด๋ฆ„์ด โ€œLexicalโ€์ผ๊นŒ?

Lexical์€ **โ€œ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ ์œ„์น˜ ๊ธฐ์ค€โ€**์ด๋ผ๋Š” ์˜๋ฏธ๋‹ค.

JavaScript์˜ ์Šค์ฝ”ํ”„๋Š” ๋‹ค์Œ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

โŒ ์–ด๋””์„œ ํ˜ธ์ถœ๋˜์—ˆ๋Š”๊ฐ€ โœ… ์–ด๋””์„œ ์„ ์–ธ๋˜์—ˆ๋Š”๊ฐ€

function outer() {
  function inner() {}
}

inner ํ•จ์ˆ˜๋Š” ์„ ์–ธ๋œ ์ˆœ๊ฐ„ ์ด๋ฏธ outer ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค.

์ด๊ฒƒ์„ Lexical Scope(์ •์  ์Šค์ฝ”ํ”„)๋ผ๊ณ  ํ•œ๋‹ค.




๐Ÿ’ก Scope Chain์ด๋ž€?

๋ณ€์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ผ ์˜ฌ๋ผ๊ฐ€๋Š” ํƒ์ƒ‰ ๊ตฌ์กฐ์ด๋‹ค

JavaScript ์—”์ง„์€ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์„ ๋•Œ ํ•œ ๋ฒˆ์— ์ „์—ญ์„ ๋ณด์ง€ ์•Š๋Š”๋‹ค. ํ˜„์žฌ ์Šค์ฝ”ํ”„๋ถ€ํ„ฐ ๋‹จ๊ณ„์ ์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

๐Ÿ”Ž ์˜ˆ์ œ ์ฝ”๋“œ

const a = 1;

function outer() {
  const b = 2;

  function inner() {
    console.log(a, b);
  }

  inner();
}

outer();

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

  1. Global Execution Context ์ƒ์„ฑ
  2. outer() ํ˜ธ์ถœ โ†’ ์ƒˆ๋กœ์šด Execution Context ์ƒ์„ฑ
  3. inner() ํ˜ธ์ถœ โ†’ ๋˜ ์ƒˆ๋กœ์šด Execution Context ์ƒ์„ฑ

inner์—์„œ ๋ณ€์ˆ˜ ์ฐพ๋Š” ๊ณผ์ •

console.log(a, b);

์—”์ง„์˜ ํƒ์ƒ‰ ์ˆœ์„œ:

b ์ฐพ๊ธฐ

inner ์Šค์ฝ”ํ”„ โ†’ ์—†์Œ

outer ์Šค์ฝ”ํ”„ โ†’ ์žˆ์Œ โœ…

a ์ฐพ๊ธฐ

inner โ†’ ์—†์Œ

outer โ†’ ์—†์Œ

global โ†’ ์žˆ์Œ โœ…

์ด์ฒ˜๋Ÿผ JavaScript๋Š”

ํ˜„์žฌ ์Šค์ฝ”ํ”„ โ†’ ์ƒ์œ„ ์Šค์ฝ”ํ”„ โ†’ ์ „์—ญ ์Šค์ฝ”ํ”„

์ˆœ์„œ๋กœ ๋ณ€์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

์ด ์—ฐ๊ฒฐ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋กœ Scope Chain์ด๋‹ค.

โญ Scope Chain์˜ ์ค‘์š”ํ•œ ํŠน์ง•

๋งŽ์ด ์˜คํ•ดํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

Scope Chain์€ ์‹คํ–‰ ์ค‘์— ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

๐Ÿ‘‰ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๋Š” ์ˆœ๊ฐ„ ์ด๋ฏธ ๊ฒฐ์ •๋œ๋‹ค.

๊ทธ๋ž˜์„œ JavaScript๋Š” ๋™์  ์Šค์ฝ”ํ”„(dynamic scope) ๊ฐ€ ์•„๋‹ˆ๋ผ ์ •์  ์Šค์ฝ”ํ”„(lexical scope)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Execution Context์™€์˜ ๊ด€๊ณ„

์ง€๊ธˆ๊นŒ์ง€ ๋‚ด์šฉ์„ ์—ฐ๊ฒฐํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ์ •๋ฆฌ๋œ๋‹ค.

Execution Context ์ƒ์„ฑ
โ†“
Lexical Environment ์ƒ์„ฑ
โ†“
Outer Reference ์—ฐ๊ฒฐ
โ†“
Scope Chain ํ˜•์„ฑ
โ†“
๋ณ€์ˆ˜ ํƒ์ƒ‰ ๊ฐ€๋Šฅ

์ฆ‰,

Execution Context โ†’ ์‹คํ–‰ ํ™˜๊ฒฝ

Lexical Environment โ†’ ๋ณ€์ˆ˜ ์ €์žฅ ๊ณต๊ฐ„

Scope Chain โ†’ ๋ณ€์ˆ˜ ํƒ์ƒ‰ ๊ทœ์น™


๐Ÿงถ ํ•ต์‹ฌ ์ •๋ฆฌ

JavaScript์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Execution Context๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  2. Lexical Environment๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  3. Environment Record์— ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
  4. Outer Reference๋กœ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.
  5. Scope Chain์„ ๋”ฐ๋ผ ๋ณ€์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค

๊ฒฐ๊ตญ JavaScript๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์Šค์ฝ”ํ”„๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.