[JavaScript] ๐Ÿ‘€execute context

Mainยท2023๋…„ 5์›” 22์ผ
0

execute context(์‹คํ–‰ ์ปจํ…์ŠคํŠธ) ?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ™˜๊ฒฝ์œผ๋กœ ์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ

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

1 ) ๋™์ผํ•œ ํ™˜๊ฒฝ์— ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ์ •๋ณด๋“ค์„ ๋ชจ์•„ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ‘‰ ๋™์ผํ•œ ํ™˜๊ฒฝ : ์‹คํ–‰์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ๊ณต๊ฐ„, eavl() ํ•จ์ˆ˜, ํ•จ์ˆ˜ ํ˜ธ์ถœ, { } ์ฝ”๋“œ ๋ธ”๋Ÿญ ์‚ฌ์šฉ ์‹œ (๋ธ”๋ก ์Šค์ฝ”ํ”„) ์ž…๋‹ˆ๋‹ค.

2 ) ์ด๋ฅผ callStack์— ์Œ“์•„ ์˜ฌ๋ ธ๋‹ค๊ฐ€ ๊ฐ€์žฅ ์œ„์— ์Œ“์—ฌ์žˆ๋Š” ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „์ฒด ์ฝ”๋“œ์˜ ํ™˜๊ฒฝ๊ณผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. (ํ›„์ž…์„ ์ถœ ๋ฐฉ์‹)
๐Ÿ‘‰ callStack : ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์ˆœ์„œ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํ… ์˜ˆ์‹œ ์ฝ”๋“œ

var a = 1;
function outer() {
  function inner() {
    console.log(a); // undefined => TDZ
    var a = 3;
  }
  inner(); // ํ•จ์ˆ˜ ์‹คํ–‰ => ํ˜„์žฌ ์‹คํ–‰์„ ๋ฉˆ์ถ”๊ณ , ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ
  console.log(a); // inner()ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„ ํ˜ธ์ถœ 1
}

outer(); // outer ํ•จ์ˆ˜ ํ˜ธ์ถœ => ํ˜„์žฌ ์‹คํ–‰์„ ๋ฉˆ์ถ”๊ณ  outer ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ
console.log(a); // outer ํ•จ์ˆ˜ ์ข…๋ฃŒ ํ›„ ํ˜ธ์ถœ 1
// ์ „์—ญ ์ปจํ…์ŠคํŠธ => outer => innter ์ˆœ์œผ๋กœ ์ฝœ ์Šคํ… ์Œ“์ž„
// ์ดํ›„ ํ•จ์ˆ˜ ์ข…๋ฃŒ ๋งˆ๋‹ค inner => outer => ์ „์—ญ ์ปจํ…์ŠคํŠธ ์ˆœ์œผ๋กœ ์ฝœ ์Šคํ…์ด ์ œ๊ฑฐ
// => ํ›„์ž…์„ ์ถœ

Execution Context์˜ ๊ตฌ์„ฑ

1 ) VariableEnvironment(๋ณ€์ˆ˜ ํ™˜๊ฒฝ)

EnviromentRecord(ํ™˜๊ฒฝ๋ ˆ์ฝ”๋“œ, ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ ์‹๋ณ„์ž๋“ค์— ๋Œ€ํ•œ ์ •๋ณด), OuterEnviromentReference(์™ธ๋ถ€ํ™˜๊ฒฝ์ฐธ์กฐ, ์ƒ์œ„ Lexical Environment๋ฅผ ์ฐธ์กฐ)๊ฐ€ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.

2 ) LexicalEnvironment(์ •์  ํ™˜๊ฒฝ)

EnviromentRecord(ํ™˜๊ฒฝ๋ ˆ์ฝ”๋“œ, ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ ์‹๋ณ„์ž๋“ค์— ๋Œ€ํ•œ ์ •๋ณด), ์™ธ๋ถ€ํ™˜๊ฒฝ์ฐธ์กฐ(OuterEnviromentReference, ์ƒ์œ„ Lexical Environment๋ฅผ ์ฐธ์กฐ)๊ฐ€ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ์—๋Š” VariableEnvironment์™€ LexicalEnvironment๊ฐ€ ๊ฐ™์ง€๋งŒ LexicalEnvironment์€ ์ฝ”๋“œ ์‹คํ–‰ ์ดํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ VariableEnvironment์™€ LexicalEnvironment ์ฐจ์ด์ 

  • Variable environment
    • Environment Record: ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๋‚ด ํ˜ธ์ด์ŠคํŒ…์ด ๋˜๋Š” ๊ฒƒ๋“ค(var, ํ•จ์ˆ˜์„ ์–ธ๋ฌธ ๋“ฑ)์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • outer Environment Reference : outer environment
  • Lexical environment
    • Environment Record: let,const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜, ํ•จ์ˆ˜ํ‘œํ˜„์‹๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
    • outer Environment Reference : Variable environment
  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ,ย variableEnvironment์— ์ •๋ณด๋ฅผ ๋จผ์ € ๋‹ด์€ ๋‹ค์Œ, ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ Lexical environment๋ฅผ ๋งŒ๋“ค๊ณ , ์ดํ›„์—๋Š” Lexical environment๋ฅผ ์ฃผ๋กœ ํ™œ์šฉ

3 ) ThisBinding

this๊ฐ’์ด ๊ฒฐ์ •๋˜๋Š” ๊ณณ ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” this ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋‹ค๋ฉด this๋Š” ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด this๋Š” ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด(window)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๊ณ , strict mode์—์„œ๋Š” undefined ๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


Environment Record์™€ Hoisting

ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋‚ด์˜ ์ฝ”๋“œ์˜ ์‹๋ณ„์ž ์ •๋ณด๋“ค์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  • ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜, ์‹๋ณ„์ž, ์„ ์–ธํ•œ ํ•จ์ˆ˜ ์ž์ฒด, var์„ ์–ธ๋œ ๋ณ€์ˆ˜ ์‹๋ณ„์ž ์ •๋ณด๋“ค์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ณผ์ •์„ ๋ชจ๋‘ ๋งˆ์น˜๋”๋ผ๋„ ์ฝ”๋“œ์€ ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ฆ‰, ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์‹๋ณ„์ž๋“ค์„ ์ด๋ฏธ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด ์˜ฌ๋ ค ๋†“์€ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์ด๊ฒƒ์ด Hoisting(ํ˜ธ์ด์ŠคํŒ…) ์ž…๋‹ˆ๋‹ค.
    => ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹ค์ œ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์€ ์•„๋‹˜ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


Scope Chain(์Šค์ฝ”ํ”„ ์ฒด์ธ)

Scope : ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์œ ํšจ๋ฒ”์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
Scope Chain์ด๋ž€ ์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ์•ˆ์—์„œ๋ถ€ํ„ฐ ๋ฐ”๊นฅ์€๋กœ ์ฐจ๋ ˆ๋กœ ๊ฒ€์ƒ‰ํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
OuterEnvironmentReference(์™ธ๋ถ€ ํ™˜๊ฒฝ ์ฐธ์กฐ)๋Š” ํ˜„์žฌ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ LexicalEnvironment(์ •์  ํ™˜๊ฒฝ)๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
์™ธ๋ถ€ ํ™˜๊ฒฝ ์ฐธ์กฐ๋Š” ์˜ค์ง ์ž์‹ ์ด ์„ ์–ธ๋œ ์‹œ์ ์˜ ์ •์  ํ™˜๊ฒฝ๋งŒ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์š”์†Œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. => (ํ›„์ž…์„ ์ถœ ๋ฐฉ์‹)
์ฆ‰, ์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋ฐœ๊ฒฐ๋œ ์‹๋ณ„์ž์—๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Scope Chain ์˜ˆ์‹œ ์ฝ”๋“œ

var a = 1;
let outer2 = function () {
  let inner2 = function () {
    console.log(a); // undefined : ์•„๋ž˜ var์— ์˜ํ•ด inner2 ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ์•ˆ์—์„œ ํ˜ธ์ด์ŠคํŒ…๋„๋˜์–ด 
    				// ์„ ์–ธ์€ ๋˜์—ˆ์ง€๋งŒ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ undefined๊ฐ€ ๋ฐ˜ํ™˜๋จ
    var a = 3; // ๋ณ€์ˆ˜์˜ ์€๋‹‰ํ™” ์ „์—ญ ๋ณ€์ˆ˜(a)์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•จ
  };
  inner2();
  console.log(a); // 1
};
outer2();
console.log(a); // 1

์˜ˆ์‹œ ์ฝ”๋“œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์‹คํ–‰๊ณผ์ •

1 ) ์ „์—ญ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ

์ „์—ญ ๋ณ€์ˆ˜ a๊ฐ€ ์„ ์–ธ๋˜๊ณ  ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. a์˜ ์ดˆ๊ธฐ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.

outer2 ํ•จ์ˆ˜๊ฐ€ ์ „์—ญ ์Šค์ฝ”ํ”„์— ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค.

2 ) outer2 ํ•จ์ˆ˜ ํ˜ธ์ถœ

outer2 ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

outer2 ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ inner2 ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

3 ) inner2 ํ•จ์ˆ˜ ํ˜ธ์ถœ

inner2 ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

inner2 ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ console.log(a) ๋ฌธ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

4 ) console.log(a) ์‹คํ–‰

inner2 ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ณ€์ˆ˜ a๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ a๋Š” ํ˜„์žฌ ์Šค์ฝ”ํ”„ ๋‚ด์—์„œ ํ˜ธ์ด์ŠคํŒ…๋˜์–ด ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ, ๊ฐ’์ด ํ• ๋‹น๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋˜์–ด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

undefined๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

5 ) var a = 3 ์žฌํ• ๋‹น

inner2 ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ด์ŠคํŒ… ๋˜์–ด์žˆ๋˜ ๋ณ€์ˆ˜ a๊ฐ’์„ 3์œผ๋กœ ์žฌํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

6 ) inner2 ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ

inner2 ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์–ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

7) console.log(a) ์‹คํ–‰

outer2 ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ณ€์ˆ˜ a๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ a๊ฐ€ outer2 ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ScopeChain๋ฅผ ํ†ตํ•ด a๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

OuterEnvironmentReference๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ LexicalEnvironment์— ์ ‘๊ทผํ•˜์—ฌ a๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ ์ปจํ…์ŠคํŠธ์ด๋ฉฐ, a ๊ฐ’์€ 1๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ a์€ 1์ด๋ผ๋Š” ๊ฐ’์„ ์ฐพ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

1์ด ์ฝ˜์†”์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

8 ) console.log(a) ์‹คํ–‰

์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ ๋ณ€์ˆ˜ a๊ฐ’์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ a๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธ๋˜์—ˆ์œผ๋ฉฐ, ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.

1์ด ์ฝ˜์†”์— ์ถœ๋ ฅ ๋ฉ๋‹ˆ๋‹ค.

9 ) outer2 ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ

outer2 ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์–ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

10 ) console.log(a) ์‹คํ–‰

์ „์—ญ ์ปจํ…์ŠคํŠธ์—์„œ ๋ณ€์ˆ˜ a๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ a๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธ๋˜์—ˆ์œผ๋ฉฐ, ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.

profile
ํ•จ๊ป˜ ๊ฐœ์„ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž / ํ˜„์žฌ ๋…ธ์…˜์œผ๋กœ ์ด๋™ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

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