๐Ÿฏ Execution context(์‹คํ–‰ ์ปจํ…์ŠคํŠธ)

Boriยท2022๋…„ 4์›” 11์ผ
2
post-thumbnail

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ž€?

Stack(์Šคํƒ)

  • ์ถœ์ž…๊ตฌ๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ๊นŠ์€ ์šฐ๋ฌผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
  • ์Šคํƒ์— ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ A-B-C-D๋ฅผ ์ €์žฅ
    โ‡’ ๊บผ๋‚ผ ๋•Œ๋Š” ๋ฐ˜๋Œ€๋กœ D-C-B-A ์ˆœ์„œ๋กœ ๊บผ๋ƒ„

Queue(ํ)

  • ์–‘์ชฝ์ด ๋ชจ๋‘ ์—ด๋ ค์žˆ๋Š” ํŒŒ์ดํ”„ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
  • ๋ณดํ†ต ํ•œ์ชฝ์€ ์ž…๋ ฅ๋งŒ, ๋‹ค๋ฅธ ํ•œ์ชฝ์€ ์ถœ๋ ฅ๋งŒ ๋‹ด๋‹นํ•˜๋Š” ๊ตฌ์กฐ
    (์ข…๋ฅ˜์— ๋”ฐ๋ผ ์–‘์ชฝ ๋ชจ๋‘ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•œ ํ๋„ ์กด์žฌ)
  • ํ์— ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ A-B-C-D๋ฅผ ์ €์žฅ
    โ‡’ ๊บผ๋‚ผ ๋•Œ๋„ A-B-C-D ์ˆœ์„œ๋กœ ๊บผ๋ƒ„

๊ทธ๋ฆผ 2-2) ์Šคํƒ๊ณผ ํ์˜ ๊ตฌ์กฐ

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

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

  • ๋™์ผํ•œ ํ™˜๊ฒฝ์— ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑ
    โ‡’ ์ด๋ฅผ call stack(์ฝœ ์Šคํƒ)์— ์Œ“์•„ ์˜ฌ๋ฆผ
    โ‡’ ๊ฐ€์žฅ ์œ„์— ์Œ“์—ฌ์žˆ๋Š” ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „์ฒด ์ฝ”๋“œ์˜ ํ™˜๊ฒฝ๊ณผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅ

  • ์—ฌ๊ธฐ์„œ '๋™์ผํ•œ ํ™˜๊ฒฝ', ์ฆ‰ ํ•˜๋‚˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

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

    ๋“ฑ์ด ์žˆ๋‹ค.
    ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ „์—ญ๊ณต๊ฐ„, eval์„ ์ œ์™ธ
    ํ”ํžˆ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• : ํ•จ์ˆ˜ ์‹คํ–‰

    ES6์—์„œ๋Š” ๋ธ”๋ก{}์— ์˜ํ•ด์„œ๋„ ์ƒˆ๋กœ์šด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

eval()

  • ๋ฌธ์ž๋กœ ํ‘œํ˜„๋œ JavaScript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜
  • ์ „์—ญ ๊ฐ์ฒด์˜ ํ•จ์ˆ˜ ์†์„ฑ
  • eval()์„ ์‚ฌ์šฉํ•˜๋ฉด ์•…์„ฑ ์ฝ”๋“œ๊ฐ€ ํ—ˆ๊ฐ€ ์—†์ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ณด์•ˆ์ด ์œ„ํ—˜ํ•˜๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ eval()์„ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ!

์˜ˆ์ œ 2-1) ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ

// -------------------- (1)
var a = 1;

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

outer(); // ----------- (3)
console.log(a); // 1

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ฝœ ์Šคํƒ์— ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์–ด๋–ค ์ˆœ์„œ๋กœ ์Œ“์ด๊ณ , ์–ด๋–ค ์ˆœ์„œ๋กœ ์ฝ”๋“œ ์‹คํ–‰์— ๊ด€์—ฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ

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

  2. (2)์—์„œ inner ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์˜ ๋งจ ์œ„์— ๋‹ด๊ธฐ๋ฉด outer ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๊ณ  inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰

๊ทธ๋ฆผ 2-3) ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ

  1. inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ a ๋ณ€์ˆ˜์— ๊ฐ’ 3์„ ํ• ๋‹น ํ›„ inner ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๊ณ , inner ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ

  2. outer ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์˜ ๋งจ ์œ„๋กœ ์กด์žฌํ•˜๊ฒŒ ๋˜๋ฉด์„œ (2)์˜ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ์ด์–ด์„œ ์‹คํ–‰. a ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ถœ๋ ฅ ํ›„ outer ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๊ณ , outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ

  3. ์ฝœ ์Šคํƒ์— ์ „์—ญ ์ปจํ…์ŠคํŠธ๋งŒ ๋‚จ์•„ ์‹คํ–‰์„ ์ค‘๋‹จํ–ˆ๋˜ (3)์˜ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ์ด์–ด์„œ ์‹คํ–‰. a ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ถœ๋ ฅ ํ›„ ์ „์—ญ ๊ณต๊ฐ„์— ์‹คํ–‰ํ•  ์ฝ”๋“œ๊ฐ€ ๋‚จ์•„์žˆ์ง€ ์•Š์•„ ์ „์—ญ ์ปจํ…์ŠคํŠธ๋„ ์ œ๊ฑฐ

  4. ์ฝœ ์Šคํƒ์— ์•„๋ฌด๊ฒƒ๋„ ๋‚จ์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ข…๋ฃŒ

ํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์˜ ๋งจ ์œ„์— ์Œ“์ด๋Š” ์ˆœ๊ฐ„ === ํ˜„์žฌ ์‹คํ–‰ํ•  ์ฝ”๋“œ์— ๊ด€์—ฌํ•˜๊ฒŒ ๋˜๋Š” ์‹œ์ 
โ‡’ ๊ธฐ์กด์˜ ์ปจํ…์ŠคํŠธ๋Š” ์ƒˆ๋กœ ์Œ“์ธ ์ปจํ…์ŠคํŠธ๋ณด๋‹ค ์•„๋ž˜์— ์œ„์น˜ํ•  ์ˆ˜๋ฐ–์— ์—†๋‹ค.

์–ด๋–ค ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋  ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์— ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ์ˆ˜์ง‘์—์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด์— ์ €์žฅ

  • VariableEnvironment
    • ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ ์‹๋ณ„์ž๋“ค์— ๋Œ€ํ•œ ์ •๋ณด + ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด.
    • ์„ ์–ธ ์‹œ์ ์˜ LexicalEnvironment์˜ ์Šค๋ƒ…์ƒท(snapshot), ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ.
  • LexicalEnvironment : ์ฒ˜์Œ์—๋Š” VariableEnvironment์™€ ๊ฐ™์ง€๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋จ.
  • ThisBinding : this ์‹๋ณ„์ž๊ฐ€ ๋ฐ”๋ผ๋ด์•ผ ํ•  ๋Œ€์ƒ ๊ฐ์ฒด.

VariableEnvironment

  • LexicalEnvironment์™€ ๊ฐ™์ง€๋งŒ ์ตœ์ดˆ ์‹คํ–‰ ์‹œ์˜ ์Šค๋ƒ…์ƒท์„ ์œ ์ง€
  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ์‹œ VariableEnvironment์— ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค.
  • ์ด ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ LexicalEnvironment๋ฅผ ์ƒ์„ฑ, ์ดํ›„์—๋Š” LexicalEnvironment๋ฅผ ์ฃผ๋กœ ํ™œ์šฉ
  • VariableEnvironment์™€ LexicalEnvironment์˜ ๋‚ด๋ถ€๋Š” environmentRecord์™€ outerEnvironmentReference๋กœ ๊ตฌ์„ฑ

LexicalEnvironment

environmentRecord

  • ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ์˜ ์‹๋ณ„์ž ์ •๋ณด ์ €์žฅ
  • ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€ ์ „์ฒด๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ญ‰ ํ›‘์–ด๋‚˜๊ฐ€๋ฉฐ ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜์ง‘
์‹๋ณ„์ž : ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์— ์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์‹๋ณ„์ž, ์„ ์–ธํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๊ทธ ํ•จ์ˆ˜ ์ž์ฒด, var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ์‹๋ณ„์ž ๋“ฑ- ๋ณ€์ˆ˜ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ณผ์ •์„ ๋งˆ์ณค๋”๋ผ๋„ ์•„์ง ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€์—ฌํ•  ์ฝ”๋“œ๋“ค์€ ์‹คํ–‰๋˜์ง€ ์ „ ์ƒํƒœ

Hoisting(ํ˜ธ์ด์ŠคํŒ…)

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

ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•˜๊ธฐ

์ฃผ์˜ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๊ตฌ๋™ ๋ฐฉ์‹์„ ์‚ฌ๋žŒ์˜ ์ž…์žฅ์—์„œ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์—”์ง„์€ ์ด๋Ÿฌํ•œ ๋ณ€๊ด€ ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ด์ŠคํŒ…

์˜ˆ์ œ 2-2) ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ด์ŠคํŒ…(1) - ์›๋ณธ ์ฝ”๋“œ

  • (1), (2), (3)์—์„œ ์–ด๋–ค ๊ฐ’๋“ค์ด ์ถœ๋ ฅ๋  ์ง€ ์˜ˆ์ƒํ•ด๋ณด๊ธฐ
    • (1) ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌํ•œ 1์ด ์ถœ๋ ฅ
    • (2) ์„ ์–ธ๋œ ๋ณ€์ˆ˜ x์— ํ• ๋‹นํ•œ ๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ undefined ์ถœ๋ ฅ
    • (3) 2 ์ถœ๋ ฅ
function a (x) {  // ์ˆ˜์ง‘ ๋Œ€์ƒ 1(๋งค๊ฐœ๋ณ€์ˆ˜)
    console.log(x); // (1)
    var x;  // ์ˆ˜์ง‘ ๋Œ€์ƒ 2(๋ณ€์ˆ˜ ์„ ์–ธ)
    console.log(x); // (2)
    var = 2; // ์ˆ˜์ง‘ ๋Œ€์ƒ 3(๋ณ€์ˆ˜ ์„ ์–ธ)
    console.log(x); // (3)
}

a(1);

์˜ˆ์ œ 2-3) ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ด์ŠคํŒ…(2) - ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€์ˆ˜ ์„ ์–ธ/ํ• ๋‹น๊ณผ ๊ฐ™๋‹ค๊ณ  ๊ฐ„์ฃผํ•ด์„œ ๋ณ€ํ™˜ํ•œ ์ƒํƒœ
โ‡’ ์ธ์ž๋“ค๊ณผ ํ•จ๊ป˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฝ์šฐ์˜ ๋™์ž‘์œผ๋กœ ์ธ์ž๋ฅผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ณด๋‹ค ๋จผ์ € ์„ ์–ธ ๋ฐ ํ• ๋‹น์ด ์ด๋ค„์ง„ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ

arguments : ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ์‹œ์ ์— ํ•จ๊ป˜ ๋งŒ๋“œ๋Š” ์ •๋ณด ์ค‘ ํ•˜๋‚˜. ์ง€์ •ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌํ•œ ์ธ์ž๊ฐ€ ๋ชจ๋‘ arguments ์ •๋ณด์— ๋‹ด๊น€.
function a () {
    var x = 1; // ์ˆ˜์ง‘ ๋Œ€์ƒ 1(๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ)
    console.log(x); // (1)
    var x;  // ์ˆ˜์ง‘ ๋Œ€์ƒ 2(๋ณ€์ˆ˜ ์„ ์–ธ)
    console.log(x); // (2)
    var x = 2; // ์ˆ˜์ง‘ ๋Œ€์ƒ 3(๋ณ€์ˆ˜ ์„ ์–ธ)
    console.log(x); // (3)
}

a();

์˜ˆ์ œ 2-4) ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ด์ŠคํŒ…(3) - ํ˜ธ์ด์ŠคํŒ…(๋ณ€์ˆ˜ ์ •๋ณด ์ˆ˜์ง‘ ๊ณผ์ •)์„ ๋งˆ์นœ ์ƒํƒœ

  • environmentRecord๋Š” ํ˜„์žฌ ์‹คํ–‰๋  ์ปจํ…์ŠคํŠธ์˜ ๋Œ€์ƒ ์ฝ”๋“œ ๋‚ด์— ์–ด๋–ค ์‹๋ณ„์ž๋“ค์ด ์žˆ๋Š”์ง€์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๊ณ , ๊ฐ ์‹๋ณ„์ž์— ํ• ๋‹น๋œ ๊ฐ’์—๋Š” ๊ด€์‹ฌ์ด ์—†๋‹ค.
    โ‡’ ๋ณ€์ˆ˜๋ฅผ ํ˜ธ์ด์ŠคํŒ…ํ•  ๋•Œ ๋ณ€์ˆ˜๋ช…๋งŒ ๋Œ์–ด์˜ฌ๋ฆฌ๊ณ  ํ• ๋‹น ๊ณผ์ •์€ ์›๋ž˜ ์ž๋ฆฌ์— ์œ„์น˜ (๋งค๊ฐœ๋ณ€์ˆ˜๋„ ๋™์ผ)
function a () {
    var x; // ์ˆ˜์ง‘ ๋Œ€์ƒ 1์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ถ€๋ถ„ - [1]
    var x; // ์ˆ˜์ง‘ ๋Œ€์ƒ 2์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ถ€๋ถ„ - [2]
    var x; // ์ˆ˜์ง‘ ๋Œ€์ƒ 3์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ถ€๋ถ„ - [3]
    
    x = 1; // ์ˆ˜์ง‘ ๋Œ€์ƒ 1์˜ ํ• ๋‹น ๋ถ€๋ถ„ - [4]
    console.log(x); // (1) - [5]
    console.log(x); //(2) - [6]
    x = 2; // ์ˆ˜์ง‘ ๋Œ€์ƒ 3์˜ ํ• ๋‹น ๋ถ€๋ถ„ - [7]
    console.log(x); // (3) - [8]
}

a(1);

์‹ค์ œ ์ฝ”๋“œ ์‹คํ–‰ ๊ณผ์ •

[1] : ๋ณ€์ˆ˜ x ์„ ์–ธ

  • ์ด ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋Š” ์ €์žฅํ•  ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ™•๋ณดํ•˜๊ณ , ํ™•๋ณดํ•œ ๊ณต๊ฐ„์˜ ์ฃผ์†Ÿ๊ฐ’์„ ๋ณ€์ˆ˜ x์— ์—ฐ๊ฒฐ

[2], [3] : ๋‹ค์‹œ ๋ณ€์ˆ˜ x ์„ ์–ธ. ์ด๋ฏธ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ x๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ฌด์‹œ

[4] : x์— 1์„ ํ• ๋‹น

  • ์ˆซ์ž 1์„ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ด๊ณ , x์™€ ์—ฐ๊ฒฐ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ˆซ์ž 1์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Ÿ๊ฐ’ ์ž…๋ ฅ

[5], [6] : (1), (2)์—์„œ ๋ชจ๋‘ 1์„ ์ถœ๋ ฅ

[7] : x์— 2๋ฅผ ํ• ๋‹น

  • ์ˆซ์ž 2๋ฅผ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ด๊ณ , ๊ทธ ์ฃผ์†Ÿ๊ฐ’์„ ๋“  ์ฑ„๋กœ x์™€ ์—ฐ๊ฒฐ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ๊ฐ„๋‹ค.
  • ์ˆซ์ž 1์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Ÿ๊ฐ’์ด ์žˆ๋Š” ๊ฒƒ์„ 2์˜ ์ฃผ์†Ÿ๊ฐ’์œผ๋กœ ๋Œ€์น˜ํ•˜์—ฌ ๋ณ€์ˆ˜ x๋Š” 2๋ฅผ ๊ฐ€๋ฆฌํ‚ด

[8] : (3)์—์„œ 2๋ฅผ ์ถœ๋ ฅ

  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์œผ๋ฏ€๋กœ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ
์˜ˆ์ƒ ์ถœ๋ ฅ ๊ฐ’์‹ค์ œ ์ถœ๋ ฅ ๊ฐ’
(1)11
(2)undefined1
(3)22

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ(function declaration)๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹(function expression)

ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•  ๋•Œ ์“ฐ์ด๋Š” ๋ฐฉ์‹

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ

  • function ์ •์˜๋ถ€๋งŒ ์กด์žฌํ•˜๊ณ , ๋ณ„๋„์˜ ํ• ๋‹น ๋ช…๋ น์ด ์—†๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  • ๋ฐ˜๋“œ์‹œ ํ•จ์ˆ˜๋ช…์ด ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

ํ•จ์ˆ˜ ํ‘œํ˜„์‹

  • ์ •์˜ํ•œ function์„ ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  • ํ•จ์ˆ˜๋ช…์ด ์—†์–ด๋„ ๋œ๋‹ค.
    • ํ•จ์ˆ˜๋ช…์„ ์ •์˜ํ•œ ํ‘œํ˜„์‹ : ๊ธฐ๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹
    • ํ•จ์ˆ˜๋ช…์„ ์ •์˜ํ•˜์ง€ ์•Š์€ ํ‘œํ˜„์‹ : ์ต๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹
      โ‡’ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ์ต๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ์˜๋ฏธ

์˜ˆ์ œ 2-8) ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ์‹

function a () { /* ... */ } // ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ. ํ•จ์ˆ˜๋ช… a ๊ฐ€ ๊ณง ๋ณ€์ˆ˜๋ช….

a(); // ์‹คํ–‰ OK

var b = function () { /* ... */ } // (์ต๋ช…) ํ•จ์ˆ˜ ํ‘œํ˜„์‹. ๋ณ€์ˆ˜๋ช… b๊ฐ€ ๊ณง ํ•จ์ˆ˜๋ช….

b(); // ์‹คํ–‰ OK

var c = function d() { /* ... */ } // ๊ธฐ๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹. ๋ณ€์ˆ˜๋ช…์€ c, ํ•จ์ˆ˜๋ช…์€ d.

c(); // ์‹คํ–‰ OK
d(); // Error, func is not defined

๊ธฐ๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ์ฃผ์˜ํ•  ์ 

  • ์™ธ๋ถ€์—์„œ๋Š” ํ•จ์ˆ˜๋ช…์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.
  • ํ•จ์ˆ˜๋ช…์€ ์˜ค์ง ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์ œ๋ฅผ ํ†ตํ•œ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ์‹ค์งˆ์ ์ธ ์ฐจ์ด

์˜ˆ์ œ 2-9) ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹(1) - ์›๋ณธ ์ฝ”๋“œ

console.log(sum(1,2));
console.log(multiply(3,4));

// ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ sum
function sum (a, b) {
    return a + b;
}

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹ multiply
var multiply = function (a, b) {
    return a * b;
}

์˜ˆ์ œ 2-10) ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹(2) - ํ˜ธ์ด์ŠคํŒ…์„ ๋งˆ์นœ ์ƒํƒœ

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๋Š” ๋‘ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š”๋ฐ, ๊ทธ ์ค‘ enritonmentRecord์˜ ์ •๋ณด ์ˆ˜์ง‘ ๊ณผ์ • ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ํ˜ธ์ด์ŠคํŒ… ๊ณผ์ •์— ๋Œ€ํ•œ ์ฝ”๋“œ
    โ‡’ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ์ „์ฒด๋ฅผ ํ˜ธ์ด์ŠคํŒ…, ๋ฐ˜๋ฉด ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ€์ˆ˜ ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…
    โ‡’ ํ•จ์ˆ˜๋„ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œ
    โ‡’ ํ•จ์ˆ˜ ํ‘œํ˜„์‹ : ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๊ฐ’์œผ๋กœ์จ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ
// ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ์ „์ฒด๋ฅผ ํ˜ธ์ด์ŠคํŒ… ํ•œ๋‹ค.
var sum = function sum (a, b) { // [1]
    return a + b;
}

// ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…
var multiply; // [2]

console.log(sum(1,2)); // [3]
console.log(multiply(3,4)); // [4]

// ๋ณ€์ˆ˜์˜ ํ• ๋‹จ๋ถ€๋Š” ์›๋ž˜ ์ž๋ฆฌ์— ์œ„์น˜
multiply = function (a, b) { // [5]
    return a * b;
}

์‹ค์ œ ์ฝ”๋“œ ์‹คํ–‰ ๊ณผ์ •

[1] : ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณด, ํ™•๋ณด๋œ ๊ณต๊ฐ„์˜ ์ฃผ์†Ÿ๊ฐ’์„ ๋ณ€์ˆ˜ sum์— ์—ฐ๊ฒฐ

[2] : ๋˜ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณด, ๊ทธ ๊ณต๊ฐ„์˜ ์ฃผ์†Ÿ๊ฐ’์„ ๋ณ€์ˆ˜ multiply์— ์—ฐ๊ฒฐ

(๋‹ค์‹œ)[1] : sum ํ•จ์ˆ˜๋ฅผ ๋˜ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ €์žฅ, ๊ทธ ์ฃผ์†Ÿ๊ฐ’์„ ์•ž์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ sum์˜ ๊ณต๊ฐ„์— ํ• ๋‹น

  • ๋ณ€์ˆ˜ sum์€ ํ•จ์ˆ˜ sum์„ ๋ฐ”๋ผ๋ณด๋Š” ์ƒํƒœ

[3] : sum์„ ์‹คํ–‰. ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด 3 ์ถœ๋ ฅ

[4] : ํ˜„์žฌ multiply์—๋Š” ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ์žˆ์ง€ ์•Š์•„ ๋น„์–ด์žˆ๋Š” ๋Œ€์ƒ์„ ํ•จ์ˆ˜๋กœ ์—ฌ๊ฒจ ์‹คํ–‰ ๋ช…๋ น์„ ํ•œ ๊ฒƒ

  • 'multiply is not a function'์ด๋ผ๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ

[5] : ์ด ํ›„์˜ ์ฝ”๋“œ๋Š” [4]์˜ ์—๋Ÿฌ๋กœ ์ธํ•ด ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ฑ„ ๋Ÿฐํƒ€์ž„ ์ข…๋ฃŒ

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์˜ ์œ„ํ—˜์„ฑ

  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์˜ ๊ฒฝ์šฐ ์„ ์–ธ ์ „์— ํ˜ธ์ถœํ•ด๋„ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ ์—†์ด ์‹คํ–‰
  • ๋™๋ช…์˜ ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋””๋ฒ„๊น… ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ๋™๋ช…์˜ ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ •์˜ ํ•œ๋‹ค๋ฉด ๋‚˜์ค‘์— ์ž‘์„ฑ๋œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—์„œ ์—๋Ÿฌ๊ฐ€ ๊ฒ€์ถœ๋˜์–ด ๋””๋ฒ„๊น…์ด ์‰ฌ์›Œ์ง„๋‹ค. (Uncaught Type Error: ํ•จ์ˆ˜ ์ด๋ฆ„ is not a function)
    โ‡’ ์ƒ๋Œ€์ ์œผ๋กœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด ์•ˆ์ „

์›ํ™œํ•œ ํ˜‘์—…์„ ์œ„ํ•ด

  • ์ „์—ญ๊ณต๊ฐ„์— ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  • ๋™๋ช…์˜ ํ•จ์ˆ˜๋ฅผ ์ค‘๋ณต ์„ ์–ธํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

์Šค์ฝ”ํ”„(scope)

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

ES5๊นŒ์ง€๋Š” ์ „์—ญ๊ณต๊ฐ„์„ ์ œ์™ธํ•˜๋ฉด ์˜ค์ง ํ•จ์ˆ˜์— ์˜ํ•ด์„œ๋งŒ ์Šค์ฝ”ํ”„๊ฐ€ ์ƒ์„ฑ
ES6์—์„œ๋Š” ๋ธ”๋ก์— ์˜ํ•ด์„œ๋„ ์Šค์ฝ”ํ”„ ๊ฒฝ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ํ•˜์—ฌ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ํ›จ์”ฌ ๋น„์Šทํ•ด์ง

  • ๋ธ”๋ก์€ var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ž‘์šฉํ•˜์ง€ ์•Š์Œ
  • ์ƒˆ๋กœ ์ƒ๊ธด let, const, strict mode์˜ ํ•จ์ˆ˜ ์„ ์–ธ ๋“ฑ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฒ”์œ„๋กœ์„œ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰
    โ‡’ ์ด ๋‘˜์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„, ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋ผ๋Š” ์šฉ์–ด ์‚ฌ์šฉ

์Šค์ฝ”ํ”„ ์ฒด์ธ(scope chain)

  • '์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„'๋ฅผ ์•ˆ์—์„œ ๋ฐ”๊นฅ์œผ๋กœ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ
  • ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๊ฐ€๋Šฅํ•˜๋Š” ํ•˜๋Š” ๊ฒƒ โ‡’ LexicalEnvironment ์˜ ๋‘ ๋ฒˆ์งธ ์ˆ˜์ง‘ ์ž๋ฃŒ์ธ outerEnvironmentReference

outerEnvironmentReference

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

๊ณผ๊ฑฐ ์‹œ์ ์ธ '์„ ์–ธ๋  ๋‹น์‹œ'์— ์ฃผ๋ชฉ

  • '์„ ์–ธํ•˜๋‹ค'๋ผ๋Š” ํ–‰์œ„๊ฐ€ ์‹ค์ œ๋กœ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ์‹œ์  = ์ฝœ ์Šคํƒ ์ƒ์—์„œ ์–ด๋–ค ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์ผ ๋•Œ
    โ‡’ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์„ ์–ธ(์ •์˜)ํ•˜๋Š” ํ–‰์œ„ ์ž์ฒด๋„ ํ•˜๋‚˜์˜ ์ฝ”๋“œ์ด๊ณ , ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™” ์ƒํƒœ์ผ ๋•Œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ

์˜ˆ์‹œ) A ํ•จ์ˆ˜ ๋‚ด๋ถ€์— B ํ•จ์ˆ˜ ์„ ์–ธ, B ํ•จ์ˆ˜ ๋‚ด๋ถ€์— C ํ•จ์ˆ˜ ์„ ์–ธ

  • ํ•จ์ˆ˜ C์˜ outerEnvironmentReference๋Š” ํ•จ์ˆ˜ B์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐ
  • ํ•จ์ˆ˜ B์˜ LexicalEnvironment์— ์žˆ๋Š” outerEnvironmentReference๋Š” ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ B๊ฐ€ ์„ ์–ธ๋˜๋˜ ๋•Œ A์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐ
    โ‡’ outerEnvironmentReference๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(linked-list)ํ˜•ํƒœ
  • '์„ ์–ธ ์‹œ์ ์˜ LexicalEnvironment'๋ฅผ ๊ณ„์† ์ฐพ์•„ ์˜ฌ๋ผ๊ฐ€๋ฉด ๋งˆ์ง€๋ง‰์—” ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
  • ๊ฐ outerEnvironmentReference๋Š” ์˜ค์ง ์ž์‹ ์ด ์„ ์–ธ๋œ ์‹œ์ ์˜ LexicalEnvironment๋งŒ ์ฐธ์กฐํ•˜๋ฏ€๋กœ, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์š”์†Œ๋กœ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ
    โ‡’ ์ด๋Ÿฐ ๊ตฌ์กฐ์  ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์—ฌ๋Ÿฌ ์Šค์ฝ”ํ”„์—์„œ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์„ ์–ธํ•œ ๊ฒฝ์šฐ, ๋ฌด์กฐ๊ฑด ์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋ฐœ๊ฒฌ๋œ ์‹๋ณ„์ž์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

์˜ˆ์ œ 2-13) ์Šค์ฝ”ํ”„ ์ฒด์ธ

var a = 1; // [1]

var outer = function () { // [2]
    var inner = function () { // [4]
        consolt.log(a); // [6]
        var a = 3; // [7]
    }; // [8]
    
    inner(); // [5]
    console.log(a); // [9]
} // [10]

outer(); // [3]
console.log(a); // [11]
  • ์‹œ์ž‘

    • ์ „์—ญ ์ปจํ…์ŠคํŠธ ํ™œ์„ฑํ™” : ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ environmentRecord์— {a, outer} ์‹๋ณ„์ž ์ €์žฅ
    • ์ „์—ญ ์ปจํ…์ŠคํŠธ๋Š” ์„ ์–ธ ์‹œ์ ์ด ์—†์œผ๋ฏ€๋กœ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ outerEnvironmentReference์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋‹ด๊ธฐ์ง€ ์•Š๋Š”๋‹ค. (this: ์ „์—ญ ๊ฐ์ฒด)
  • [1], [2] : ์ „์—ญ ์Šค์ฝ”ํ”„์— ์žˆ๋Š” ๋ณ€์ˆ˜ a์— 1์„ outer์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹น

  • [3] : outer ํ•จ์ˆ˜ ํ˜ธ์ถœ

    • ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ ์ฝ”๋“œ๋Š” [3]์—์„œ ์ž„์‹œ ์ค‘๋‹จ
    • outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด [2]๋กœ ์ด๋™
  • [2]

    • outer ์ปจํ…์ŠคํŠธ์˜ environmentRecord์— {inner} ์‹๋ณ„์ž ์ €์žฅ
    • outerEnvironmentReference์—๋Š” outer ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ LexicalEnvironment๊ฐ€ ๋‹ด๊ธด๋‹ค.
    • outer ํ•จ์ˆ˜๋Š” ์ „์—ญ ๊ณต๊ฐ„์—์„œ ์„ ์–ธ๋์œผ๋ฏ€๋กœ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐ๋ณต์‚ฌ
      โ‡’ ์ด๋ฅผ [GLOBAL, {a, outer}]๋ผ๊ณ  ํ‘œ๊ธฐ (this: ์ „์—ญ ๊ฐ์ฒด)
      - GLOBAL : ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ด๋ฆ„
      - {a, outer} : environmentRecord์˜ ๊ฐ์ฒด
  • [4] : outer ์Šค์ฝ”ํ”„์— ์žˆ๋Š” ๋ณ€์ˆ˜ inner์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹น

  • [5] : inner ํ•จ์ˆ˜ ํ˜ธ์ถœ

    • outer ์ปจํ…์ŠคํŠธ์˜ ์ฝ”๋“œ๋Š” [5]์—์„œ ์ž„์‹œ ์ค‘๋‹จ
    • inner ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด [4]๋กœ ์ด๋™
  • [4]

    • inner ์ปจํ…์ŠคํŠธ์˜ environmentRecord์— {a} ์‹๋ณ„์ž ์ €์žฅ
    • outerEnvironmentReference์—๋Š” inner ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ LexicalEnvironment๊ฐ€ ๋‹ด๊ธด๋‹ค.
    • inner ํ•จ์ˆ˜๋Š” outer ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋์œผ๋ฏ€๋กœ outer ํ•จ์ˆ˜์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐ๋ณต์‚ฌ
      โ‡’ [outer, {a}] (this: ์ „์—ญ ๊ฐ์ฒด)
  • [6] : ์‹๋ณ„์ž a ์— ์ ‘๊ทผ

    • ํ˜„์žฌ ํ™œ์„ฑํ™” ์ƒํƒœ์ธ inner ์ปจํ…์ŠคํŠธ์˜ environmentRecord์—์„œ a๋ฅผ ๊ฒ€์ƒ‰
    • a๊ฐ€ ๋ฐœ๊ฒฌ๋๋Š”๋ฐ ์—ฌ๊ธฐ์—๋Š” ์•„์ง ํ• ๋‹น๋œ ๊ฐ’์ด ์—†์Œ
      โ‡’ undefined ์ถœ๋ ฅ
  • [7] : inner ์Šค์ฝ”ํ”„์— ์žˆ๋Š” ๋ณ€์ˆ˜ a์— 3์„ ํ• ๋‹น

  • [8] : inner ํ•จ์ˆ˜ ์‹คํ–‰ ์ข…๋ฃŒ

    • inner ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ
    • ๋ฐ”๋กœ ์•„๋ž˜์˜ outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”
    • ์ค‘๋‹จํ–ˆ๋˜ [5]์˜ ๋‹ค์Œ์œผ๋กœ ์ด๋™
  • [9] : ์‹๋ณ„์ž a ์— ์ ‘๊ทผ

    • ์ด ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ™œ์„ฑํ™”๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment์— ์ ‘๊ทผ
    • ์ฒซ ์š”์†Œ์˜ environmentRecord์—์„œ a ๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณด๊ณ , ์—†์œผ๋ฉด outerEnvironmentReference์— ์žˆ๋Š” environmentRecord๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฒ€์ƒ‰ ์ง„ํ–‰
    • ์ „์—ญ LexicalEnvironment์— a๊ฐ€ ์žˆ์œผ๋‹ˆ ๊ทธ a์— ์ €์žฅ๋œ ๊ฐ’ 1์„ ๋ฐ˜ํ™˜
      โ‡’ 1 ์ถœ๋ ฅ
  • [10] : outer ํ•จ์ˆ˜ ์‹คํ–‰ ์ข…๋ฃŒ

    • outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ
    • ๋ฐ”๋กœ ์•„๋ž˜์˜ ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”
    • ์ค‘๋‹จํ–ˆ๋˜ [3]์˜ ๋‹ค์Œ์œผ๋กœ ์ด๋™
  • [11] : ์‹๋ณ„์ž a ์— ์ ‘๊ทผ

    • ํ˜„์žฌ ํ™œ์„ฑํ™” ์ƒํƒœ์ธ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ environmentRecord์—์„œ a๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ a๋ฅผ ์ฐพ์Œ
      โ‡’ 1 ์ถœ๋ ฅ
    • ๋ชจ๋“  ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์–ด ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๊ณ  ์ข…๋ฃŒ

์˜ˆ์ œ 2-13) ์Šค์ฝ”ํ”„ ์ฒด์ธ ๋‚ด์šฉ ์ •๋ฆฌ

  • '์ „์—ญ ์ปจํ…์ŠคํŠธ โ€ฃ outer ์ปจํ…์ŠคํŠธ โ€ฃ inner ์ปจํ…์ŠคํŠธ' ์ˆœ์œผ๋กœ ์ ์ฐจ ๊ทœ๋ชจ๊ฐ€ ์ž‘์•„์ง„๋‹ค
  • ๋ฐ˜๋ฉด ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ํƒ€๊ณ  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜์˜ ์ˆ˜๋Š” ๋Š˜์–ด๋‚œ๋‹ค.
    • ์ „์—ญ ๊ณต๊ฐ„์—์„œ ์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ ์ƒ์„ฑ๋œ ๋ณ€์ˆ˜์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • outer ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” outer, ์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ ์ƒ์„ฑ๋œ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” inner, outer, ์ „์—ญ ์Šค์ฝ”ํ”„ ๋ชจ๋‘์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

๋ณ€์ˆ˜ ์€๋‹‰ํ™”(variable shadowing)

  • ์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ผ๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • ์˜ˆ์ œ 2-13์—์„œ ์‹๋ณ„์ž a๋Š” ์ „์—ญ ๊ณต๊ฐ„, inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ
    • inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ a์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ inner ์Šค์ฝ”ํ”„์˜ LexicalEnvironment๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•˜๊ณ , a ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•˜๋ฉด ์Šค์ฝ”ํ”„ ์ฒด์ธ ๊ฒ€์ƒ‰์„ ๋ฉˆ์ถ”๊ณ  inner LexicalEnvironment ์ƒ์˜ a๋ฅผ ๋ฐ˜ํ™˜
      โ‡’ ์ฆ‰, inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ a ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ ๊ณต๊ฐ„์—์„œ ์„ ์–ธํ•œ a ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ  ์ด๋ฅผ ๋ณ€์ˆ˜ ์€๋‹‰ํ™”๋ผ๊ณ  ํ•œ๋‹ค.

์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜

  • ์ „์—ญ๋ณ€์ˆ˜ : ์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜
  • ์ง€์—ญ๋ณ€์ˆ˜ : ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜
    โ‡’ ์ฝ”๋“œ์˜ ์•ˆ์ „์„ฑ์„ ์œ„ํ•ด ๊ฐ€๊ธ‰์  ์ „์—ญ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

this

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ThisBinding์—๋Š” this๋กœ ์ง€์ •๋œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ
  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ํ™œ์„ฑํ™” ๋‹น์‹œ this๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, this๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ
  • ๊ทธ ๋ฐ–์—๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ this์— ์ €์žฅ๋˜๋Š” ๋Œ€์ƒ์ด ๋‹ฌ๋ผ์ง„๋‹ค.

this์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ What is 'this' in JavaScript?์— ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌ

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ : ์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด

    • ์ „์—ญ ์ปจํ…์ŠคํŠธ : ์ „์—ญ ๊ณต๊ฐ„์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
    • eval ๋ฐ ํ•จ์ˆ˜ ์‹คํ–‰์— ์˜ํ•œ ์ปจํ…์ŠคํŠธ ๋“ฑ
  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋Š” ํ™œ์„ฑํ™”๋˜๋Š” ์‹œ์ ์— VariableEnvironment, LexicalEnvironment, ThisBinding์˜ ์„ธ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘

    • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ VariableEnvironment์™€ LexicalEnvironment๋Š” ๋™์ผํ•œ ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์ง€๋งŒ
    • LexicalEnvironment : ํ•จ์ˆ˜ ์‹คํ–‰ ๋„์ค‘์— ๋ณ€๊ฒฝ๋˜๋Š” ์‚ฌํ•ญ์ด ์ฆ‰์‹œ ๋ฐ˜์˜
      • environmentRecord์™€ outerEnvironmentReference๋กœ ๊ตฌ์„ฑ
      • environmentRecord : ์„ ์–ธํ•œ ํ•จ์ˆ˜์˜ ํ•จ์ˆ˜๋ช… ๋“ฑ์„ ์ˆ˜์ง‘
      • outerEnvironmentReference : LexicalEnvironment ์ •๋ณด๋ฅผ ์ฐธ์กฐ
    • VariableEnvironment : ์ดˆ๊ธฐ ์ƒํƒœ ์œ ์ง€
  • ํ˜ธ์ด์ŠคํŒ…

    • ์ฝ”๋“œ ํ•ด์„์„ ์ข€ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด environmentRecord์˜ ์ˆ˜์ง‘ ๊ณผ์ •์„ ์ถ”์ƒํ™”ํ•œ ๊ฐœ๋…
    • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€์—ฌํ•˜๋Š” ์ฝ”๋“œ ์ง‘๋‹จ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์ด๋“ค์„ '๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค'๊ณ  ํ•ด์„ํ•˜๋Š” ๊ฒƒ
    • ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๊ฐ’ ํ• ๋‹น์ด ๋™์‹œ์— ์ด๋ค„์ง„ ๋ฌธ์žฅ : '์„ ์–ธ๋ถ€'๋งŒ ํ˜ธ์ด์ŠคํŒ…
      (ํ• ๋‹น ๊ณผ์ •์€ ์›๋ž˜ ์ž๋ฆฌ์— ์œ„์น˜)
    • ์—ฌ๊ธฐ์„œ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒ
  • ์Šค์ฝ”ํ”„ : ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„

    • outerEnvironmentReference๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์œ„์น˜์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐ
    • ์ฝ”๋“œ ์ƒ์—์„œ ์–ด๋–ค ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ๋•Œ, ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐœ๊ฒฌ๋˜๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ๋‹ค์‹œ outerEnvironmentReference์— ๋‹ด๊ธด LexicalEnvironment๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ณผ์ •์ด ๋ฐ˜๋ณต
    • ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๊นŒ์ง€ ํƒ์ƒ‰ํ•ด๋„ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ undefined๋ฅผ ๋ฐ˜ํ™˜
  • ์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜

    • ์ „์—ญ๋ณ€์ˆ˜ : ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment์— ๋‹ด๊ธด ๋ณ€์ˆ˜
    • ์ง€์—ญ๋ณ€์ˆ˜ : ๊ทธ ๋ฐ–์˜ ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€์ˆ˜
      โ‡’ ์•ˆ์ „ํ•œ ์ฝ”๋“œ ๊ตฌ์„ฑ์„ ์œ„ํ•ด ๊ฐ€๊ธ‰์  ์ „์—ญ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ ์ตœ์†Œํ™”
  • this

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

์ฐธ๊ณ 


๋งˆ๋ฌด๋ฆฌ

  • ์ด ๊ธ€๋งŒ ๋ณด๊ณ ๋„ ์ฑ…์˜ ๋‚ด์šฉ์ฒ˜๋Ÿผ ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•˜๋ ค๋‹ค๋ณด๋‹ˆ ์ฑ…์„ ๊ทธ๋ƒฅ ์˜ฎ๊ธฐ๋Š” ์ˆ˜์ค€์œผ๋กœ ์ •๋ฆฌํ•œ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.
    โ‡’ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฑ…์ด ๋” ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜ํ•˜
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹œ์ž‘์œผ๋กœ ์—ฐ๊ด€๋œ ๋ถ€๋ถ„์„ ์ด์–ด์„œ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•˜๋‹ค๋ณด๋‹ˆ ๋‹ค์Œ ์ฝ”์–ด์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ •๋ฆฌ ๋‚ด์šฉ์€ ํด๋กœ์ €๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

comment-user-thumbnail
2022๋…„ 4์›” 27์ผ

๋Œ€๋ฐ•

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ