๐Ÿ’ป ์‹คํ–‰์ปจํ…์ŠคํŠธ(JavaScript)

waterglassesยท2022๋…„ 9์›” 29์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
35/50
post-thumbnail

โš ๏ธ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์€ ์˜คํƒ€๋‚˜ ์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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

ํ˜„์žฌ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ปจํ…์ŠคํŠธ์—์„œ ์ด ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ์ด ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์ œ์–ด๊ถŒ์„ ๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ์ปจํ…์ŠคํŠธ๋“ค์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ ์•ˆ์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค. ๊ฐ๊ฐ์˜ ์ปจํ…์ŠคํŠธ๋Š” ์‹คํ–‰์ด ์ข…๋ฃŒ๋œ ์ดํ›„ ์†Œ๋ฉธ๋˜๋ฉฐ, ์†Œ๋ฉธ๋œ ํ›„ ์ด์ „์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋œ๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๊ตฌ์„ฑ ์š”์†Œ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” Lexical Environment์™€ Variable Environment ๋‘๊ฐ€์ง€ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ปดํฌ๋„ŒํŠธ๋“ค์€ Environment Records๋ผ ๋ถˆ๋ฆฌ๋Š” ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

ES2015๋ถ€ํ„ฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ

  • ES5์—์„œ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— this๋ฐ”์ธ๋”ฉ ์ •๋ณด๊ฐ€ ๋ณ„๋„๋กœ ์ €์žฅ๋˜์—ˆ์ง€๋งŒ ES2015๋ถ€ํ„ฐ๋Š” EnvorinmentRecords์—์„œ this๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅ
  • ๊ธฐ์กด ES2015์—์„œ๋Š” Lexical Environment: ER + LE ๋กœ ์ €์žฅ๋˜์–ด์žˆ์—ˆ์ง€๋งŒ ํ˜„์žฌ ๋ช…์„ธ์—์„œ๋Š” EnvironmentRecords์—์„œ ์‹๋ณ„์ž, this ๋ฐ”์ธ๋”ฉ, ์ƒ์œ„ ER์— ๋Œ€ํ•œ ์ฐธ์กฐ๊นŒ์ง€ ์ €์žฅ
  • LE์™€ VE๊ฐ€ ER ์ž์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ๋จ
function foo() {
  let a = 1;
  const b = 2;
  var c = 3;

  console.log(a + b + c);
}
foo();

foo ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ LE์™€ VE๋Š” fooํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. ์„ ์–ธํ•œ ์‹๋ณ„์ž์™€ this๋ฐ”์ธ๋”ฉ ๊ทธ๋ฆฌ๊ณ  ์ƒ์œ„ ์Šค์ฝ”ํ”„์ธ ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ GlobalER์„ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ถ€ ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๋Š”๋‹ค.

Environment Records์™€ ์Šค์ฝ”ํ”„ ์ฒด์ธ

ER์€ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠน์ • ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์‹๋ณ„์ž์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋ชจ๋“  ER์—๋Š” OuterEnv ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด ํ•„๋“œ๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ๋Œ€ํ•œ ER์„ ์ฐธ์กฐํ•œ๋‹ค.

์Šค์ฝ”ํ”„ ์ฒด์ธ์ด๋ž€ ์šฉ์–ด๋Š” ES3์ดํ›„๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์šฉ์–ด, ๊ทธ๋ ‡์ง€๋งŒ ์ง๊ด€์ ์ธ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋“ฏ ํ•จ. Lexical Environment ๊ฐœ๋…์ด ๋„์ž…๋œ ์ดํ›„ ECMAScript์—๋Š” lexical nesting structure ์šฉ์–ด๋ฅผ ์‚ฌ์šฉ

Environment Records์˜ ํ•˜์œ„ ER

  1. declarative Environment Record - ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ๋ชจ๋“ˆ, ํด๋ž˜์Šค ๋“ฑ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ๋‚ด์— ์„ ์–ธ๋œ ์‹๋ณ„์ž๋“ค์„ ๋ฐ”์ธ๋”ฉ
    1. function Environment Record
      • ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” this๊ฐ’๊ณผ new.target์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง„๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋ฉฐ, super๋กœ ์ƒ์œ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
    2. module Environment Record
      - ๋ชจ๋“ˆ์˜ ์™ธ๋ถ€ ์Šค์ฝ”ํ”„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋ณด๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค. ๋‹ค๋ฅธ ER์— ์กด์žฌํ•˜๋Š” ์‹๋ณ„์ž์— ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ(import) ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ณตํ•œ๋‹ค.
  2. object Environent Record
    • binding object๋ผ๋Š” ๊ฐ์—์ธผ ํ”„๋กœํผํ‹ฐ๋“ค์„ ์‹๋ณ„์ž๋กœ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
  3. global Environment Record
    • ์ตœ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ์„ ์–ธ๋œ ์‹๋ณ„์ž๋“ค๊ณผ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
    • declarative ER + objectER ํ˜•ํƒœ๋กœ object ER์€ binding object๋ฅผ ํ†ตํ•ด ๋‚ด์žฅ ์ „์—ญ ๊ฐ์ฒด์™€ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ๋“ฑ์„ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ด๊ฒƒ์ด window๋กœ ์ ‘๊ทผํ•˜๋Š” ์ „์—ญ ๊ฐ์ฒด์ด๋‹ค. ๊ทธ ์™ธ ๋‚˜๋จธ์ง€ ์‹๋ณ„์ž๋“ค์€ declarative ER์— ์ €์žฅํ•˜๋ฉฐ ์ด๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋ผ ๋ถ€๋ฅธ๋‹ค.

Lexical Environment์™€ Variable Environment

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ๋ฐ”์ธ๋”ฉ์€ VE๋ฅผ ํ†ตํ•ด ์ฐพ๊ณ , ์ด์™ธ์˜ ์‹๋ณ„์ž๋“ค์€ LE๋ฅผ ํ†ตํ•ด ์ฐพ๋Š”๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ƒ์„ฑ ๊ณผ์ •

    function foo() {
      let x = 1;
      function bar() {
        const y = 2;
        var z = 3;
        console.log(x + y + z); // 6
      }
      bar();
    }
    foo();

1. ์ „์—ญ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ๊ณผ ๋ฐ”์ธ๋”ฉ

  • ๊ฐ€์žฅ ๋จผ์ € ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ถ”๊ฐ€๋˜๋ฉฐ Global ER์ด ์ƒ์„ฑ๋จ.
  • Global ER์€ this์™€ outerEnvํ•„๋“œ๋งŒ ์„ค์ •๋˜๊ณ  ์ดํ›„ fooํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์„ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.

2. foo ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ๊ณผ ๋ฐ”์ธ๋”ฉ

  • foo ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด foo ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋˜์–ด ์ œ์–ด๊ถŒ์„ ๊ฐ€์ ธ๊ฐ„๋‹ค.
  • foo ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ LE์™€ VE๋กœ ๊ตฌ์„ฑ์ด ๋˜๊ณ  OuterEnv๋กœ ์ƒ์œ„ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๊ฐ€ Global ER์ด๋ฏ€๋กœ ์ด๋กœ ์ •ํ•ด์ง„๋‹ค.
  • ์ดํ›„ ์‹๋ณ„์ž๋“ค๊ณผ this๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.(์†Œ์Šค ํ‰๊ฐ€ ๊ณผ์ •)

3. bar ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ๊ณผ ๋ฐ”์ธ๋”ฉ

  • bar ์ปจํ…์ŠคํŠธ๋„ ํ˜ธ์ถœ๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค.
  • const ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” LE์— var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” VE์— ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

๐Ÿ”ฅ ๋Š๋‚€์ 

์‹คํ–‰์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด์„œ ๊ทธ๋™์•ˆ ๊ณ„์† ๊ณต๋ถ€๋ฅผ ํ•˜์˜€์ง€๋งŒ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์—ˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ์ด๋ฒˆ์— ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๊นจ๋‹ฌ์•˜๋‹ค.
ํ™•์‹คํžˆ ๊ฐœ๋… ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๋‹ค์‹œ ๋˜์งš์–ด ๋ณด์•˜๋”๋‹ˆ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ตฌ๋‚˜ํ•˜๊ณ  ํ๋ฆ„์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค. ๊ทธ๋™์•ˆ ๊ณต๋ถ€ํ–ˆ๋‹ค๊ณ  ํ•˜๋ฉด์„œ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๊ตฌ๋‚˜ ์‹ถ์—ˆ๋‹ค. ์•ž์œผ๋กœ ๋” ๋งŽ์€ ๊ฐœ๋…๋“ค์„ ์•ˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ง๊ณ  ๋ฐ˜๋ณตํ•ด์„œ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค.~0~

ref

profile
๋งค ์ˆœ๊ฐ„ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€