์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋™์ž‘ ๊ณผ์ •

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ด๊ณ , ์–ด๋– ํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

 

 


 

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์ด๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ, ์ „์—ญ ์ฝ”๋“œ ์‹คํ–‰, eval() ์‹คํ–‰ ๋“ฑ ๋ชจ๋“  ์‹คํ–‰ ๋‹จ์œ„๊ฐ€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๊ณ  ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์‹ค์ œ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์˜์—ญ์ด๋‹ค.

-์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

 

 

๊ตฌ์„ฑ์š”์†Œ

 

 

 

Call Stack

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋‹จ์ผ Call Stack์„ ์‚ฌ์šฉํ•ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

๊ฐ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  Call Stack์— ์Œ“์ธ๋‹ค.

 

1. ์ƒ์„ฑ ๋‹จ๊ณ„

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ์„ ์–ธ๋ฌธ๋งŒ ์‹คํ–‰ํ•ด์„œ ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ(Environment Record)์— ๊ธฐ๋กํ•œ๋‹ค.

 

2. ์‹คํ–‰ ๋‹จ๊ณ„

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

 

 

call stack ๊ณผ์ •

console.log(Foo); // 1

var Foo = "์‘๊ฐ€" // 2

console.log(Foo); // 3
  1. ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ : Call Stack์— ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์Œ“์ธ๋‹ค.
  2. ๋ณ€์ˆ˜ ์„ ์–ธ : Foo๋Š” var ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๊ธฐํ™”๋˜๊ธฐ ์ „์— undefined๋กœ ์„ค์ •๋œ๋‹ค.
  3. ์ „์—ญ ์‹คํ–‰ ์ข…๋ฃŒ : ๋ชจ๋“  ์ฝ”๋“œ ์‹คํ–‰์ด ๋๋‚˜๋ฉด Call Stack์ด ๋น„์›Œ์ง„๋‹ค.

 

 

๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ varํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  const, let์„ ์‚ฌ์šฉํ•ด ์„ ์–ธ์„ ํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ๋ชปํ•ด Reference Error๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

 

 

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

 

1. ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ

  • ์ฝ”๋“œ ์‹คํ–‰ ์‹œ์ ์— ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•œ ์Šค์ฝ”ํ”„ ์ •๋ณด๊ฐ€ ์ €์žฅ

2. ๋ณ€์ˆ˜ ํ™˜๊ฒฝ

  • ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™” ์ •๋ณด๋ฅผ ํฌํ•จ

3. this ๋ฐ”์ธ๋”ฉ

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ this๊ฐ€ ๊ฒฐ์ •๋จ
์Šค์ฝ”ํ”„๋ž€ ๋ฒ”์œ„๋ผ๋Š” ๋œป์œผ๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์Šค์ฝ”ํ”„๋Š” "๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„"๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

 

๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ

 

1. ์™ธ๋ถ€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ Outer Enviconment Reference

  • ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ฐธ์กฐ, ๋ฐ”๊นฅ Lexical Environment๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

2. ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ Environment Record

  • ์‹๋ณ„์ž๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๋“ฑ๋ก๋œ ์‹๋ณ„์ž์— ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค.

 

 

์˜ˆ์‹œ

 

์‹๋ณ„์ž ๊ฒฐ์ •

์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ

var x = 1;
const y = 2;

function foo() {
    var x = 3;
    const y = 4;

    function bar() {
        const z = 5;
        console.log(x + y + z);
    }
    bar();
}

foo();

 

๋ณ€์ˆ˜ x, y, ํ•จ์ˆ˜ foo๊ฐ€ ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ์— ๋“ฑ๋ก๋œ๋‹ค.

 

 

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

 

 

๋งŒ์•ฝ ํ™˜๊ฒฝ๋ ˆ์ฝ”๋“œ์— ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

 

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

barํ•จ์ˆ˜์˜ outer๋Š” ์ด์ „ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ธ foo๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

 

๋ณ€์ˆ˜ ํƒ์ƒ‰ ๊ณผ์ •

  1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค. ์›์น™์ ์œผ๋กœ ํ˜„์žฌ ํ™œ์„ฑํ™”๋œ(๊ฐ€์žฅ ์œ„์— ์žˆ๋Š”) ์‹คํ–‰์ปจํ…์ŠคํŠธ์˜ ํ™˜๊ฒฝ๋ ˆ์ฝ”๋“œ๋ฅผ ๋จผ์ € ๋ณธ๋‹ค.
  2. ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด outer๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ”๊นฅ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ํƒ์ƒ‰์„ ์ด์–ด๊ฐ„๋‹ค.
  3. ๋ชจ๋“  ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ํƒ์ƒ‰ํ•ด๋„ ์‹๋ณ„์ž๊ฐ€ ์—†์œผ๋ฉด Reference Error๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 


 

์ฐธ๊ณ 

'Javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํด๋กœ์ €์™€ useState  (0) 2025.01.09
Map๊ณผ ์ผ๋ฐ˜๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ๊ฐ€์š”?  (1) 2024.10.03