ํ”„๋กœ๊ทธ๋ž˜๋ฐ/JavaScript

[JavaScript] ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Execution Context)๊ฐ€ ๋ฌด์—‡์ผ๊นŒ์š”?

์šฉ๋‡ฝ 2024. 1. 30. 22:31
๋ฐ˜์‘ํ˜•

 

[JavaScript] ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Execution Context)๊ฐ€ ๋ฌด์—‡์ผ๊นŒ์š”?

๋“ค์–ด๊ฐ€๋ฉฐ ๐Ÿ“–

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Execution Context)์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์ˆ™์ง€ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•ต์‹ฌ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ์™€ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋˜์ฃ .

์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Excution Context)๋ž€โ“

์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์  ์–ธ์–ด๋กœ์„œ์˜ ์„ฑ๊ฒฉ์„ ๊ฐ€์žฅ ์ž˜ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋Š” ์‹œ์ ์— ์•„๋ž˜์™€ ๊ฐ™์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ํ˜ธ์ด์ŠคํŒ…(hoisting)
  • ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด ๊ตฌ์„ฑ
  • this ๊ฐ’ ์„ค์ •

๋“ฑ๋“ฑ ์ด๋กœ ์ธํ•ด ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์—†๋Š” ํŠน์ดํ•œ ํ˜•์ƒ๋“ค์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘ ๊ณผ์ •

๋™์ผํ•œ ํ™˜๊ฒฝ์— ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์ฝœ ์Šคํƒ(Call Stack)์— ์Œ“์•„ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

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

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š”

  • ์ „์—ญ ๊ณต๊ฐ„
  • eval() ํ•จ์ˆ˜
  • ํ•จ์ˆ˜

๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

var a = 1;
function outer() {
  function inner() {
    console.log(a); // undefined
    var a = 3;
  }
  inner();
  console.log(a); // 1
}
outer();
console.log(a); // 1

์œ„ ์ฝ”๋“œ์˜ ์ˆœ์„œ๋ฅผ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ด€์ ์—์„œ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ

  1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์‹คํ–‰
  2. ์ „์—ญ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝœ ์Šคํƒ์— ์ถ”๊ฐ€
  3. ์ „์—ญ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์„ ์ˆœ์ฐจ๋กœ ์ง„ํ–‰
  4. outer์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ์ •๋ณด ์ˆ˜์ง‘
  5. outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ํ›„ ์ฝœ ์Šคํƒ์— ์ถ”๊ฐ€
  6. ์ „์—ญ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ผ์‹œ์ค‘๋‹จ (์ฝœ ์Šคํƒ ๋งจ ์œ„์— outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋†“์ธ ์ƒํƒœ)
  7. outer ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ ์ˆœ์ฐจ๋กœ ์‹คํ–‰
  8. inner ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ํ›„ ์ฝœ ์Šคํƒ์— ์ถ”๊ฐ€
  9. outer์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ผ์‹œ์ค‘๋‹จ (์ฝœ ์Šคํƒ ๋งจ ์œ„์— inner ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋†“์ธ ์ƒํƒœ)
  10. inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ ์ˆœ์ฐจ๋กœ ์‹คํ–‰
  11. ์ดํ›„์— ํ•จ์ˆ˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋ฉด ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ ๋˜๊ณ  ์•„๋ž˜์— ์žˆ๋˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ด์–ด์„œ ์‹คํ–‰

๊ตฌ์„ฑ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋‹ด๊ธฐ๋Š” ์ •๋ณด๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

VariableEnvironment

  • ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ ์‹๋ณ„์ž๋“ค์— ๋Œ€ํ•œ ์ •๋ณด
  • ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด
  • ์„ ์–ธ ์‹œ์ ์˜ LexicalEnvironment์˜ ์Šค๋ƒ…์ƒท โžก๏ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ

VariableEnvironment์— ๋‹ด๊ธฐ๋Š” ๋‚ด์šฉ์€ LexicalEnvironment์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ตœ์ดˆ ์‹คํ–‰ ์‹œ์˜ ์Šค๋ƒ…์ƒท์„ ์œ ์ง€ํ•œ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ VariableEnvironment์— ์ •๋ณด๋ฅผ ๋จผ์ € ๋‹ด์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ LexicalEnvironment๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

์ดํ›„์—๋Š” LexicalEnvironment๋ฅผ ์ฃผ๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

LexicalEnvironment

  • ์ดˆ๊ธฐ์—๋Š” VaribaleEnvironment์™€ ๊ฐ™์Œ
  • ์ดํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋จ

environmentRecord์™€ ํ˜ธ์ด์ŠคํŒ…

environmentRecord์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„, ํ•จ์ˆ˜ ์„ ์–ธ, ๋ณ€์ˆ˜๋ช… ๋“ฑ์ด ๋‹ด๊น๋‹ˆ๋‹ค.

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

์‹๋ณ„์ž ์ •๋ณด๋ž€?
ํ•จ์ˆ˜์— ์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์‹๋ณ„์ž, ํ•จ์ˆ˜ ์ž์ฒด, var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ์‹๋ณ„์ž ๋“ฑ๋“ฑ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€ ์ „์ฒด๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์œผ๋กœ ๋ณ€์ˆ˜ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ,

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ด๋ฏธ ํ•ด๋‹น ํ™˜๊ฒฝ์— ์†ํ•œ ์ฝ”๋“œ์˜ ๋ณ€์ˆ˜๋ช…๋“ค์„ ๋ชจ๋‘ ์•Œ๊ฒŒ ๋œ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ํ˜ธ์ด์ŠคํŒ…(hoisting)์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.

 

ํ˜ธ์ด์ŠคํŒ…์— ๊ด€๋ จํ•ด์„œ๋Š” ํ•ด๋‹น ๊ธ€์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์Šค์ฝ”ํ”„(Scope)์™€ outerEnvironmentReference

  • ์Šค์ฝ”ํ”„(Scope)๋ž€ ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์œ ํšจ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.
  • ์–ด๋–ค ๊ฒฝ๊ณ„ A์˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” A์˜ ์™ธ๋ถ€๋ฟ ์•„๋‹ˆ๋ผ A์˜ ๋‚ด๋ถ€์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ, A์˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์˜ค์ง A์˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ES5
๊นŒ์ง€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ „์—ญ๊ณต๊ฐ„์„ ์ œ์™ธํ•˜๋ฉด ์˜ค์ง ํ•จ์ˆ˜์— ์˜ํ•ด์„œ๋งŒ ์Šค์ฝ”ํ”„๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
ES6์—์„œ๋Š” ๋ธ”๋ก์— ์˜ํ•ด์„œ๋„ ์Šค์ฝ”ํ”„ ๊ฒฝ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ธ”๋ก์€ ES6์— ๋“ฑ์žฅํ•œ let, const, class, strict mode์—์„œ์˜ ํ•จ์ˆ˜ ์„ ์–ธ ๋“ฑ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฒ”์œ„๋กœ์„œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‘˜์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„, ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ์•ˆ์—์„œ๋ถ€ํ„ฐ ๋ฐ”๊นฅ์œผ๋กœ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด LexicalEnvironment์˜ ๋‘ ๋ฒˆ์งธ ์ˆ˜์ง‘ ์ž๋ฃŒ์ธ outerEnvironmentReference์ž…๋‹ˆ๋‹ค.

 

outerEnvironmentReference๋Š” ํ˜„์žฌ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

'์„ ์–ธํ•˜๋‹ค'๋ผ๋Š” ํ–‰์œ„๊ฐ€ ์‹ค์ œ๋กœ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ์‹œ์ ์ด๋ž€?
์ฝœ ์Šคํƒ ์ƒ์—์„œ ์–ด๋–ค ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์ผ ๋•Œ๋ฟ์ž…๋‹ˆ๋‹ค.
์ฆ‰, ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™” ์ƒํƒœ์ผ ๋•Œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด A ํ•จ์ˆ˜ ๋‚ด๋ถ€์— B ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋‹ค์‹œ B ํ•จ์ˆ˜ ๋‚ด๋ถ€์— C ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ ๊ฒฝ์šฐ

  • ํ•จ์ˆ˜ C์˜ outerEnvironmentReference โžก๏ธ ํ•จ์ˆ˜ B์˜ LexicalEnvironment
  • ํ•จ์ˆ˜ B์˜ outerEnvironmentReference โžก๏ธ ํ•จ์ˆ˜ A์˜ LexicalEnvironment
  • ์ด์ฒ˜๋Ÿผ outerEnvironmentReference๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(linked list) ํ˜•ํƒœ๋ฅผ ๋ฑ๋‹ˆ๋‹ค.

์„ ์–ธ ์‹œ์ ์˜ LexicalEnvironment๋ฅผ ๊ณ„์† ์ฐพ์•„ ์˜ฌ๋ผ๊ฐ€๋ฉด ๋งˆ์ง€๋ง‰์—๋Š” ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ฐ outerEnvironmentReference๋Š” ์˜ค์ง ์ž์‹ ์ด ์„ ์–ธ๋œ ์‹œ์ ์˜ LexicalEnvironment๋งŒ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์š”์†Œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ ‘๊ทผ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์  ํŠน์„ฑ ๋•๋ถ„์— ์—ฌ๋Ÿฌ ์Šค์ฝ”ํ”„์—์„œ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์„ ์–ธํ•œ ๊ฒฝ์šฐ์—๋Š” ๋ฌด์กฐ๊ฑด ์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋ฐœ๊ฒฌ๋œ ์‹๋ณ„์ž์—๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

// ์‹œ์ž‘: ์ „์—ญ ์ปจํ…์ŠคํŠธ ํ™œ์„ฑํ™” (์„ ์–ธ ์‹œ์ ์ด ์—†์œผ๋ฏ€๋กœ outerEnvironmentReference๋Š” ๋นˆ ๊ฐ’)
// enviromnetRecord์—{a, outer} ์‹๋ณ„์ž ์ €์žฅ
var a = 1; // ์ „์—ญ ์Šค์ฝ”ํ”„์˜ a์— 1 ํ• ๋‹น
var outer = function () {
	// enviromnetRecord์— { inner } ์‹๋ณ„์ž ์ €์žฅ
  var inner = function () {
  	// environmentRecord์— { a } ์‹๋ณ„์ž ์ €์žฅ
    console.log(a); // environmentRecord์—์„œ a๋ฅผ ๊ฒ€์ƒ‰ => ์•„์ง ๊ฐ’์ด ํ• ๋‹น ๋˜์ง€ ์•Š์Œ undefined ์ถœ๋ ฅ
    var a = 3;
  }
  inner(); // inner ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ํ™œ์„ฑํ™” => ์„ ์–ธ ๋‹น์‹œ์ธ outer์˜ LexicalEnvironment ์ฐธ์กฐ๋ณต์‚ฌ 
  console.log(a); // enviromnetRecord์—์„œ a๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ ์—†์Œ => outerEnvironmentReference์— ์žˆ๋Š” enviromnetRecord๋ฅผ ํƒ์ƒ‰ => 1 ์ถœ๋ ฅ
}
outer(); // outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ํ™œ์„ฑํ™” => ์„ ์–ธ ๋‹น์‹œ์ธ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment ์ฐธ์กฐ๋ณต์‚ฌ ์ฒซ๋ฒˆ์งธ๋กœ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ด๋ฆ„, ๋‘๋ฒˆ์งธ๋กœ environmentRecord ๊ฐ์ฒด(this: ์ „์—ญ ๊ฐ์ฒด)
console.log(a);

ThisBinding

์‹๋ณ„์ž๊ฐ€ ๋ฐ”๋ผ๋ด์•ผ ํ•  ๋Œ€์ƒ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์ฆ‰, this๋กœ ์ง€์ •๋œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ ํ™œ์„ฑํ™” ๋‹น์‹œ์— this๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ this์—๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

this์— ๋Œ€ํ•ด์„œ๋Š” ํ•ด๋‹น ๊ธ€์—์„œ  ์ž์„ธํžˆ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์ •๋ฆฌ ๐Ÿ“•

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด
    • ์ „์—ญ ๊ณต๊ฐ„์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ „์—ญ ์ปจํ…์ŠคํŠธ
    • eval()
    • ํ•จ์ˆ˜ ์‹คํ–‰์— ์˜ํ•œ ์ปจํ…์ŠคํŠธ
  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ํ™œ์„ฑํ™”๋˜๋Š” ์‹œ์ ์— ์„ธ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘
    • VariableEnvironment: : environmentRecord, outerEnvironmnetReference๋กœ ๊ตฌ์„ฑ, ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•จ.
    • LexicalEnvironment: VariableEnvironment์™€ ๋™์ผํ•œ ๊ตฌ์„ฑ, ํ•จ์ˆ˜ ์‹คํ–‰ ๋„์ค‘์— ๋ณ€๊ฒฝ๋˜๋Š” ์‚ฌํ•ญ์ด ์ฆ‰์‹œ ๋ฐ˜์˜
    • ThisBinding
  • environmentRecord๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ช…, ๋ณ€์ˆ˜์˜ ์‹๋ณ„์ž, ์„ ์–ธํ•œ ํ•จ์ˆ˜์˜ ํ•จ์ˆ˜ ๋ช… ๋“ฑ์„ ์ˆ˜์ง‘
  • outerEnvironmnet๋Š” ์ง์ „ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment ์ •๋ณด๋ฅผ ์ฐธ์กฐ
  • environmentRecord์˜ ์ˆ˜์ง‘ ๊ณผ์ •์„ ์ถ”์ƒํ™”ํ•œ ๊ฐœ๋… โžก๏ธ ํ˜ธ์ด์ŠคํŒ…(hoisting)
  • ์Šค์ฝ”ํ”„๋Š” ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ๋œปํ•จ
    • ์ฝ”๋“œ ์ƒ์—์„œ ์–ด๋–ค ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๋ฅผ ํƒ์ƒ‰
    • ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๊นŒ์ง€ ๋„๋‹ฌํ•ด๋„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด undefined ๋ฐ˜ํ™˜
  • ์ „์—ญ ๋ณ€์ˆ˜ = ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment์— ๋‹ด๊ธด ๋ณ€์ˆ˜
  • ์ง€์—ญ ๋ณ€์ˆ˜ = ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€์ˆ˜
  • this์—๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋‹น์‹œ์— ์ง€์ •๋œ this๊ฐ€ ์ €์žฅ๋จ

์ฐธ๊ณ  ๋ฌธํ—Œ: ์ฝ”์–ด์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

๋ฐ˜์‘ํ˜•