Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Latest commit

ย 

History

History
297 lines (226 loc) ยท 8.95 KB

File metadata and controls

297 lines (226 loc) ยท 8.95 KB

๐Ÿ’ป Execution Context


๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Execution Context)

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ฝ”๋“œ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด(Scope, Hoisting, this, function, closure ๋“ฑ)๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ๊ฐœ๋…์ด๋‹ค.
  • ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง€๊ณ  ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด์˜ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฐ”๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ฝ”๋“œ ๋…ํ•ด๊ฐ€ ์–ด๋ ค์›Œ์ง€๋ฉฐ ๋””๋ฒ„๊น…๋„ ๋งค์šฐ ๊ณค๋ž€ํ•ด ์งˆ ๊ฒƒ์ด๋‹ค.

๐Ÿƒ ์ข…๋ฅ˜

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋Š” 3๊ฐ€์ง€๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
  • ์ „์—ญ ์ฝ”๋“œ, ํ•จ์ˆ˜ ์ฝ”๋“œ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์ด๋‹ค.

1. ์ „์—ญ ์ฝ”๋“œ: ์ „์—ญ ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ์ฝ”๋“œ
2. ํ•จ์ˆ˜ ์ฝ”๋“œ: ํ•จ์ˆ˜ ๋‚ด์— ์กด์žฌํ•˜๋Š” ์ฝ”๋“œ
3. Eval ์ฝ”๋“œ: eval()๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ

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

1. ๋ณ€์ˆ˜: ์ „์—ญ ๋ณ€์ˆ˜, ์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ ๋ณ€์ˆ˜, ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ
2. ํ•จ์ˆ˜ ์„ ์–ธ
3. ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„ (Scope)
4. this

    1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๊ธ€๋กœ๋ฒŒ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Global Execution Context, GEC)๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
    1. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Function Execution Context, FEC)๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • ์ด๋•Œ ์ฃผ์˜ํ•  ์ ์€, ๊ธ€๋กœ๋ฒŒ์˜ ๊ฒฝ์šฐ ์‹คํ–‰ ์ด์ „์— ์ƒ์„ฑ๋˜์ง€๋งŒ, ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜ธ์ถœํ•  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ(Exectuion Context Stack)

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ํ”ํžˆ ์ฝœ ์Šคํƒ(Call Stack)์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค.
  • GEC๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์Œ“์ด๊ณ , ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ œ๊ฑฐ๋œ๋‹ค.
  • FEC๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์Œ“์ด๊ณ  ํ˜ธ์ถœ์ด ๋๋‚˜๋ฉด ์ œ๊ฑฐ๋œ๋‹ค.
var x = "xxx";

function foo() {
  var y = "yyy";

  function bar() {
    var z = "zzz";
    console.log(x + y + z);
  }
  bar();
}
foo();
  • ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์ด ์ƒ์„ฑ๋˜๊ณ  ์†Œ๋ฉธํ•œ๋‹ค.
  • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…์ŠคํŠธ์—์„œ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ ์—†๋Š” ์ฝ”๋“œ(ex. ๋‹ค๋ฅธ ํ•จ์ˆ˜)๋“ค์€ ์‹คํ–‰๋˜๋ฉด ์ƒˆ๋กœ์šด ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ ๋œ๋‹ค.
  • ์ด ์ปจํ…์ŠคํŠธ๋Š” ์Šคํƒ์— ์Œ“์ด๊ฒŒ ๋˜๊ณ  ์ปจํŠธ๋กค(์ œ์–ด๊ถŒ)์ด ์ด๋™ํ•œ๋‹ค.

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


๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ตฌ์„ฑ ์š”์†Œ

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” Lexical Environment, Variable Environment, this ๋ฐ”์ธ๋”ฉ 3๊ฐœ์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ฐ–๋Š”๋‹ค.

๐Ÿƒ Lexical Environment

  • Lexical Environment๋Š” ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜ ๋“ฑ์˜ ์‹๋ณ„์ž(Identifier) ๋ฐ ์™ธ๋ถ€ ์ฐธ์กฐ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ๋Š” Environment Record, outer ์ฐธ์กฐ 2๊ฐœ์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ฐ–๋Š”๋‹ค.
  • Environment Record๊ฐ€ ์‹๋ณ„์ž์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, outer ์ฐธ์กฐ๋Š” ์™ธ๋ถ€ Lexical Environment๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ์ธ๋‹ค.
  • ์ข€ ๋” ํ’€์–ด์“ฐ์ž๋ฉด Environment Record๋Š” ์ตœ์ดˆ์˜ ๋ณ€์ˆ˜, Arguments, ํ•จ์ˆ˜ ์„ ์–ธ๋“ค์„ ์ €์žฅํ•œ๋‹ค.
  • outer๋Š” ๋ถ€๋ชจ Environment(reference)๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ƒ์„ฑ ๋  ๋•Œ, Lexical Environment์™€ Variable Environment์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋‚˜, ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ Variable Environment์™€ ๋‹ฌ๋ฆฌ Lexical Environment์˜ ๊ตฌ์„ฑ์š”์†Œ์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค.
var x = 10;

function foo() {
  var y = 20;
  console.log(x);
}
  • ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด Lexical Environment๊ฐ€ ํ˜•์„ฑ๋œ๋‹ค.

  globalEnvironment = {
    environmentRecord = { x: 10 },
    outer: null
  }

  fooEnvironment = {
    environmentRecord = { y: 20 },
    outer: globalEnvironment
  }
  • ๋”ฐ๋ผ์„œ, foo() ์—์„œ x๋ฅผ ์ฐธ์กฐํ•  ๋•Œ๋Š” fooEnvironment์˜ Environment Record๋ฅผ ์ฐพ์•„๋ณด๊ณ , ์—†๊ธฐ ๋•Œ๋ฌธ์— outer ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€์˜ Lexical Environment์— ์†ํ•ด ์žˆ๋Š” Environment Record๋ฅผ ์ฐพ์•„๋ณด๋Š” ๋ฐฉ์‹์ด๋‹ค.

๐Ÿƒ Variable Environment

  • Variable Environment๋Š” Lexical Environment์™€ ๋™์ผํ•œ ์„ฑ๊ฒฉ์„ ๊ฐ–์ง€๋งŒ var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋งŒ ์ €์žฅํ•œ๋‹ค๋Š” ์ ์—์„œ ๋‹ค๋ฅด๋‹ค.
  • ์ฆ‰, Lexical Environment๋Š” var๋ฅผ ์ œ์™ธํ•œ, let, ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ, ํ•จ์ˆ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋“ค์„ ์ €์žฅํ•œ๋‹ค.
  • ์ฝ”๋“œ์— ์˜ํ•ด ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜/ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ์ ˆ๋Œ€ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฝ”๋“œ ์ฐธ๊ณ 

๐Ÿƒ this ๋ฐ”์ธ๋”ฉ

  • this์˜ ๋ฐ”์ธ๋”ฉ์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค this ๊ฐ์ฒด์— ์–ด๋–ป๊ฒŒ ๋ฐ”์ธ๋”ฉ์ด ๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ this ํ‚ค์›Œ๋“œ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  • this์˜ ํ‚ค์›Œ๋“œ๋Š” ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ํŒจํ„ด์—์˜ํ•ด ๊ฒฐ์ • ๋œ๋‹ค.
  • ES6๋ถ€ํ„ฐ๋Š” this์˜ ๋ฐ”์ธ๋”ฉ์ด Lexical Environment ์•ˆ์— ์žˆ๋Š” Environment Record ์•ˆ์—์„œ ์ผ์–ด๋‚œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์ž.(๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜์ง€๋Š” ์•Š๋‹ค.)
  • GEC์˜ ๊ฒฝ์šฐ
    • Strict Mode๋ผ๋ฉด undefined๋กœ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.
    • Strict Mode๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.(๋ธŒ๋ผ์šฐ์ €์—์„  Window, ๋…ธ๋“œ์—์„  Global)
  • FEC์˜ ๊ฒฝ์šฐ
    • ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ๊ณผ์ •

  • Execution Context๋Š” 2๊ฐ€์ง€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
  • Creation Phase(์ƒ์„ฑ ๋‹จ๊ณ„), Execution Phase(์‹คํ–‰ ๋‹จ๊ณ„)

๐Ÿƒ ์ƒ์„ฑ ๋‹จ๊ณ„

  • ์ƒ์„ฑ ๋‹จ๊ณ„๋Š” ๋‹ค์‹œ 3๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  • Lexical Environment ์ƒ์„ฑ, Variable Environment ์ƒ์„ฑ, this ๋ฐ”์ธ๋”ฉ
  • ์ฃผ์˜ํ•  ์ ์€ ๊ฐ’์ด ๋ณ€์ˆ˜์— ๋งคํ•‘๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. var์˜ ๊ฒฝ์šฐ undefined๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ , let์ด๋‚˜ const๋Š” ์•„๋ฌด ๊ฐ’๋„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.

๐Ÿƒ ์‹คํ–‰ ๋‹จ๊ณ„

  • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋งคํ•‘์‹œํ‚จ๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋ณด์ž
var a = 3;
let b = 4;

function func(num) {
  var t = 9;
  console.log(a + b + num + t);
}

var r = func(4);

  • GEC์˜ ์ƒ์„ฑ ๋‹จ๊ณ„, ์—ฌ๊ธฐ์„œ ์ƒ์„ฑ์ด ๋  ๋•Œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์— ์Œ“์ธ๋‹ค.
  GEC {
    ThisBinding: window,
    LexicalEnvironment: {
      EnvironmentRecord: {
        b: <uninitialized>,
        func: func(){...}
      },
      outer: null
    },
    VariableEnvironment: {
      EnvironmentRecord: {
        a: undefined,
        r: undefined
      },
      outer: null
    }
  }

  • GEC์˜ ์‹คํ–‰ ๋‹จ๊ณ„
  GEC {
    ThisBinding: window,
    LexicalEnvironment: {
      EnvironmentRecord: {
        b: 4,
        func: func(){...}
      },
      outer: null
    },
    VariableEnvironment: {
      EnvironmentRecord: {
        a: 3,
        r: undefined
      },
      outer: null
    }
  }
  • ์ดํ›„์— func()์„ ํ˜ธ์ถœํ•˜๊ณ  FEC๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • FEC์˜ ์ƒ์„ฑ ๋‹จ๊ณ„
  FEC {
    ThisBinding: window,
    LexicalEnvironment: {
      EnvironmentRecord: {
        arguments: { num: 4, length: 1 },
      },
      outer: GEC์˜ LexicalEnvironment
    },
    VariableEnvironment: {
      EnvironmentRecord: {
        t: undefined
      },
      outer: GEC์˜ LexicalEnvironment
    }
  }

  • FEC์˜ ์‹คํ–‰ ๋‹จ๊ณ„
  FEC {
    ThisBinding: window,
    LexicalEnvironment: {
      EnvironmentRecord: {
        arguments: { num: 4, length: 1 },
      },
      outer: GEC์˜ LexicalEnvironment
    },
    VariableEnvironment: {
      EnvironmentRecord: {
        t: 9
      },
      outer: GEC์˜ LexicalEnvironment
    }
  }
  • FEC๊ฐ€ ์Šคํƒ์—์„œ ์ œ๊ฑฐ ๋˜๊ณ  GEC์˜ r์ด 20์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค.

  GEC {
    ThisBinding: window,
    LexicalEnvironment: {
      EnvironmentRecord: {
        b: 4,
        func: func(){...}
      },
      outer ์ฐธ์กฐ: null
    },
    VariableEnvironment: {
      EnvironmentRecord: {
        a: 3,
        r: 20
      },
      outer ์ฐธ์กฐ: null
    }
  }
  • ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  GEC๊ฐ€ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ ๋’ค ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค.
  • ์ฝ”๋“œ ์ฐธ๊ณ ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋” ํ™•์‹คํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ 

https://github.com/baeharam/Must-Know-About-Frontend/blob/master/Notes/javascript/execution-context.md https://minjung-jeon.github.io/Execution-Context/ https://velog.io/@imacoolgirlyo/JS-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-Hoisting-The-Execution-Context-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-6bjsmmlmgy https://poiemaweb.com/js-execution-context