์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ปจํ…์ŠคํŠธ

2021. 9. 26. 01:27ใ†๐Ÿ“š Book/Core Javascript

์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ( ์ •์žฌ๋‚จ  ่‘— ) 2์žฅ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

1. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ (Execution context)

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

์‹คํ–‰ ์ปจํ…์ŠคํŠธ : ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ œ๊ณต๋˜๋Š” ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ๋ชจ์•„ ๋‘” ๊ฐ์ฒด. 

 

ํ•˜๋‚˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ฃผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(์ด์™ธ์—๋„ ์ „์—ญ๊ณต๊ฐ„์ด๋‚˜ eval() ํ•จ์ˆ˜ ๋“ฑ์ด ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ํŒจ์Šคํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ง์—ญํ•˜๋ฉด ์‹คํ–‰ ๋ฌธ๋งฅ์ธ๋ฐ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฌธ๋งฅ, ์ฆ‰ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?

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

 

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

ํ™˜๊ฒฝ์ •๋ณด๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๊ฐ์ฒด๋ผ ํ•˜์˜€๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • Variable Environment : ์ปจํ…์ŠคํŠธ ๋‚ด ์‹๋ณ„์ž์˜ ์ •๋ณด + ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด, ์„ ์–ธ ์‹œ์ ์˜ Lexical Environment ์˜ ๊ฐ’ (๋ณ€๊ฒฝ์‚ฌํ•ญ ์ถ”์  x)
  • Lexical Environment : ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ๋Š” Variable Environment ์™€ ์™„์ „ํžˆ ๋™์ผํ•˜๋‚˜, ์ดํ›„์—” ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • ThisBinding : ์ปจํ…์ŠคํŠธ ๋‚ด์˜ ์‹๋ณ„์ž๊ฐ€ ๋ฐ”๋ผ๋ด์•ผ ํ•  ๋Œ€์ƒ ๊ฐ์ฒด

1 - 2.  ์ฝœ์Šคํƒ

// (a)
var a = 100;

function outer() {
    function inner() {
        console.log(a)  // undefined
        var a = 300;
    }
    inner();  // (b)
    console.log(a); // 100
}

outer();  // (c)
console.log(a);  // 1

 

(a)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์‹คํ–‰๋˜๋ฉด(a), ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์— ๋‹ด๊น๋‹ˆ๋‹ค.

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

(c)

๊ทธ ํ›„๋ก  (c) ์—์„œ outer() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ์‹คํ–‰์ปจํ…์ŠคํŠธ๊ฐ€ ์—ด๋ฆฌ๋ฉฐ, outer() ํ•จ์ˆ˜๋ฅผ ์ฝœ์Šคํƒ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

์ฝœ์Šคํƒ์˜ ์ƒ๋‹จ์—” outer ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋†“์ด๊ฒŒ ๋˜์–ด ์ „์—ญ ์ปจํ…์ŠคํŠธ๋Š” ๋‹ค์‹œ ์ƒ๋‹จ์— ์˜ค๊ฒŒ ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ž ์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

 

(b)

outer ์˜ ์‹คํ–‰์ปจํ…์ŠคํŠธ๊ฐ€ ์—ด๋ฆฌ๋ฉด์„œ, outer ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค (b) ์ง€์ ์—์„œ inner() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ inner() ์˜ ์‹คํ–‰์ปจํ…์ŠคํŠธ๊ฐ€ ์—ด๋ฆฌ๊ณ , ์ฝœ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ์€ inner() ๊ฐ€ ์ฐจ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

inner() ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ๋๋‚œ ํ›„ ์ฝœ์Šคํƒ์—์„œ inner() ํ•จ์ˆ˜๋Š” pop ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ outer() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ outer() ์—ญ์‹œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝœ์Šคํƒ์—์„œ ๋น ์ ธ๋‚˜์˜ค๊ฒŒ ๋˜๋ฉฐ, ์ „์—ญ ์ปจํ…์ŠคํŠธ๋งŒ ๋‚จ์€ ์ฝœ์Šคํƒ์€ ๋งˆ์ € ์ „์—ญ ์ปจํ…์ŠคํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

์ถœ์ฒ˜: ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ 


2. Lexical Environment

Lexical Environment : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ๋“ฑ์˜ ์‹๋ณ„์ž๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด

Lexical Environment ๋Š” environment Record ์™€ outer Environment Reference ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ๋‚ด์šฉ์„ ์ฝ๊ณ ์žˆ๋Š”์ง€, ์ž ์‹œ ๋ฉ€๋ฆฌ์„œ ๋ฐ”๋ผ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

 

2 - 1.  environmentRecord ์™€ ํ˜ธ์ด์ŠคํŒ…

environment Record ๋Š” ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์˜ ์‹๋ณ„์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์‹๋ณ„์ž, ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์˜ ํ•จ์ˆ˜, var, let, const ๋“ฑ์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ์‹๋ณ„์ž๊ฐ€ environment Record ์˜ ์ˆ˜์ง‘๋Œ€์ƒ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

 

์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์˜ ์‹๋ณ„์ž๋ฅผ ์ˆ˜์ง‘ํ•œ ๊ฒƒ๊ณผ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ ๋ณ„๊ฐœ์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์ฆ‰ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ๋„ ์ „์—, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ด๋ฏธ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์˜ ๋ณ€์ˆ˜(์‹๋ณ„์ž)๋ฅผ ๋ชจ๋‘ ํŒŒ์•…ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

 

2 - 1 - 0. Hoisting

ํ˜ธ์ด์ŠคํŒ…์€ ์ผ์ข…์˜ ๊ฐ€์ƒ ๊ฐœ๋…์ธ๋ฐ, ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๋ฅผ ๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค๋Š” ์˜๋ฏธ๋กœ ํ”ํžˆ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์‹๋ณ„์ž๋ฅผ ๋ฏธ๋ฆฌ ํŒŒ์•…ํ•œ ๊ฒƒ์„ ์ผ์ข…์˜ '๋Œ์–ด์˜ฌ๋ฆผ' ์œผ๋กœ ํ˜•์ƒํ™”ํ•˜์—ฌ ํ‘œํ˜„ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์‹ค์ œ๋กœ ์‹๋ณ„์ž๋ฅผ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํŽธ์˜์ƒ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ž๊ณ  ๋ถ™์ธ ๊ฐ€์ƒ ๊ฐœ๋…์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.)

 

2 - 1 - 1. ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹

environment Record ๋Š” ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์˜ ์‹๋ณ„์ž ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ ๋…ํ•˜๋ฉฐ ํ•จ์ˆ˜์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

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

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

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

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

 

 

ํ˜ธ์ด์ŠคํŒ…์ด๋ผ๋Š” ๊ฐ€์ƒ์˜ ๊ฐœ๋…์„ ํ†ตํ•ด ์‹๋ณ„์ž๊ฐ€ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š” ์ž‘์—…์ด ์ผ์–ด๋‚œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ์—์„œ (a) ๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ์ „์ฒด๊ฐ€ ํ˜ธ์ด์ŠคํŒ… ๋˜๊ณ ,

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ€์ˆ˜ ์„ ์–ธ๋ถ€(b)๋งŒ ํ˜ธ์ด์ŠคํŒ… ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

// before hoisting

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


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

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


//////// after hoisting ////////

var sum = function sum(a, b) {   // (a)
    return a + b;
}

var multiply;   // (b)

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

multiply = function (a, b) {
    return a * b;
};

 

ํ˜ธ์ด์ŠคํŒ…์ด๋ผ๋Š” ๊ฐ€์ƒ์˜ ๊ณผ์ •์„ ํ†ตํ•ด ๊ฐ๊ฐ sum ๊ณผ multiply ๊ฐ€ console.log() ๋ณด๋‹ค ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค์กŒ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ sum() ์€ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ์จ ๋Œ์–ด ์˜ฌ๋ ค์ง„๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

sum ๋ณ€์ˆ˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํ•œ ๊ณณ์„ ์ฐจ์ง€ํ•˜๋ฉฐ, sum ํ•จ์ˆ˜ ์—ญ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ๋‹ค๋ฅธ ๊ณณ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

sum ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ sum ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ, ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ํ•ด๋‹น ๋ณ€์ˆ˜์— ํ• ๋‹น ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sum ํ•จ์ˆ˜๋Š” sum ๋ณ€์ˆ˜์— ํ• ๋‹น๋ผ๊ธฐ ๋•Œ๋ฌธ์— sum ํ•จ์ˆ˜์˜ ์ฃผ์†Ÿ๊ฐ’์„ sum ๋ณ€์ˆ˜์˜ ๊ณต๊ฐ„์— ํ• ๋‹นํ•˜์—ฌ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ˜๋ฉด์— ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ธ multiply ๋Š” ๋ณ€์ˆ˜ multiply ๋งŒ ํ˜ธ์ด์ŠคํŒ… ๋  ๋ฟ, ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์ฐธ์กฐํ•  ์ฃผ์†Œ๋Š” ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒํƒœ๋กœ console.log(multiply(3, 4)) ๋ฅผ ์ฐ์œผ๋ฉด 'multiply is not a function' ์ด๋ž€ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋งŒ ์ถœ๋ ฅ ๋  ๋ฟ์ž…๋‹ˆ๋‹ค.

(b) ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ multiply ๋Š” ๊ทธ์ € ์‹๋ณ„์ž์— ๋ถˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๋‹ค์‹œ environmentRecord ์˜ ๊ด€์ ์—์„œ ์‚ดํŽด๋ณด๋ฉด, ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์˜ environmentRecord ๋Š” sum ์‹๋ณ„์ž์™€ ํ•จ์ˆ˜์ •์˜๋ถ€๋ฅผ, ๊ทธ๋ฆฌ๊ณ  ์‹๋ณ„์ž ๋ฟ์ธ multiply ๋ฅผ ์ €์žฅํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ง€๊ธˆ๊นŒ์ง€ ๋งฅ๋ฝ์„ ์‚ดํŽด๋ณด๋ฉด ์—๋Ÿฌ๋ฅผ ๋‚ด์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์งฑ์งฑ ์•„๋‹Œ๊ฐ€? ํ•˜๊ณ  ์ƒ๊ฐํ•˜์‹ค์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ˜„์—…์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

2 - 1 - 2 ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด ๋” ์•ˆ์ „ํ•œ ์ด์œ 

console.log(sum(1, 2));   // (a)

function sum(a, b) {
    return a + b;
}

var a = sum(1, 2);   // (b)

/// after 1000 line ///

function sum(a, b) {
    return a + '+' +  b + '=' + (x + y);
}

var c = sum(1, 2);   // (c)
console.log(c)   // (d)

 

์œ„ ์ฝ”๋“œ์—์„œ sum() ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— (a) ์—์„œ ๋ฌด๋ฆฌ ์—†์ด sum(1,2) ์˜ ๊ฒฐ๊ณผ๊ฐ’์ธ 3์„ ์ถœ๋ ฅํ•  ๊ฒƒ์ด๋ผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

ํ•˜์ง€๋งŒ 1000 ์ค„ ์ดํ›„, ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ ธ ๊ธฐ์กด์— sum() ํ•จ์ˆ˜์˜ ์กด์žฌ๋ฅผ ์žŠ๊ณ  ์‹ค์ˆ˜๋กœ ๋™์ผํ•œ ์ด๋ฆ„์˜ sum() ํ•จ์ˆ˜๊ฐ€ ์žฌ์ •์˜ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” ๋‘๋ฒˆ์งธ sum() ํ•จ์ˆ˜ ์—ญ์‹œ, ํ˜ธ์ด์ŠคํŒ… ๋˜์–ด ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š”๋ฐ, ์ด ๋•Œ ๊ธฐ์กด์— ์ˆซ์ž๋ฅผ ๋ฆฌํ„ดํ•˜๋˜ ํ•จ์ˆ˜์˜ ๋‚ด์šฉ์„ ๋ฎ์–ด๋ฒ„๋ฆฌ๋Š” ์ƒํ™ฉ(์˜ค๋ฒ„๋ผ์ด๋“œ)์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

1000 ์ค„ ์ด์ „์˜ ์ฝ”๋“œ์—์„œ๋Š” ๋‹น์—ฐํžˆ (a) ์—์„œ ์ˆซ์žํ˜• ๊ฐ’์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋ผ ๋ฏฟ์—ˆ์ง€๋งŒ, ์˜ค๋ฒ„๋ผ์ด๋“œ ๋œ sum() ํ•จ์ˆ˜๋กœ ์ธํ•˜์—ฌ (a) ์—์„œ๋„ ๋œฌ๊ธˆ์—†๋Š” ๋ฌธ์ž์—ด ๊ฐ’์ด ์ถœ๋ ฅ๋˜๋Š” ์ƒํ™ฉ์ด ๋ฒŒ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์„ค์ƒ๊ฐ€์ƒ์œผ๋กœ ์—๋Ÿฌ ๊ฒ€์ถœ๋„ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋Š ๋ถ€๋ถ„์ด ๋ฌธ์ œ์ธ์ง€ ๋” ์ฐพ๊ธฐ ํž˜๋“ค์–ด์ง€๊ฒ ์ฃ ?

 

๊ทน๋‹จ์ ์ด์ง€๋งŒ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด ๊ฐ€์ง€๋Š” ์œ„ํ—˜์„ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ์˜€์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ๋์„๊นŒ์š”?

 

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ, ํ•จ์ˆ˜๊ฐ€ ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋งŒ ํ˜ธ์ด์ŠคํŒ… ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. 

console.log(sum(1, 2));   // (a) -- Uncaught Type Error: sum is not a function

var sum = function (a, b) {
    return a + b;
}

var a = sum(1, 2);   // (b)

/// after 1000 line ///

var sum = function(a, b) {
    return a + '+' +  b + '=' + (x + y);
}

var c = sum(1, 2);   // (c)
console.log(c)   // (d)

(a) ๋ถ€๋ถ„์—์„œ ๊ณง๋ฐ”๋กœ ์—๋Ÿฌ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ•จ์ˆ˜ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ sum ๋ณ€์ˆ˜ ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…๋˜์–ด undefined ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋น„๋ก (a) ์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•ด๋‹น ๋ถ€๋ถ„๋งŒ ์ง€๋‚˜๋ฉด ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ ๋งˆ์ฃผํ–ˆ๋˜ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1000์ค„ ์ดํ›„์—์„œ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ sum ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด๋„, (b) ์™€ (c) ์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ๋Œ€๋กœ ๊ฐ’์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

 

๋งŒ์•ฝ ์ƒ์ˆ˜๋กœ ํ•จ์ˆ˜ํ‘œํ˜„์‹์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด, ๋™์ผํ•œ ์ด๋ฆ„์˜ ํ•จ์ˆ˜์— ๋Œ€ํ•ด Syntax Error ๋ฅผ ๋ฐœ์ƒํ•˜์—ฌ, ์‚ฌ์ „์— ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์•„๋ž˜์˜ sum() ํ•จ์ˆ˜์„ ์–ธ๋ฌธ์˜ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œ(๋‘๋ฒˆ์งธ sum ์ด ์ฒซ๋ฒˆ์งธ sum ์„ ๋ฎ์–ด๋ฒ„๋ฆฐ๋‹ค) ๋˜๋Š”๊ฒƒ์„ ์ด์ œ๋Š” ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ •๋ฆฌ

1. ์ „์—ญ๊ณต๊ฐ„์— ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ฑฐ๋‚˜, ๋™๋ช…์˜ ํ•จ์ˆ˜๋ฅผ ์ค‘๋ณต ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ž์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

2. ์ „์—ญ๊ณต๊ฐ„์— ๋™๋ช…์˜ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ์ƒํ™ฉ์ด๋”๋ผ๋„, ํ•ด๋‹น ํ•จ์ˆ˜๋“ค์ด ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ •์˜๋๋‹ค๋ฉด ์œ„ ๊ฐ™์€ ์—๋Ÿฌ ์ƒํ™ฉ์€ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. const ์ƒ์ˆ˜์— ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ํ• ๋‹นํ•œ๋‹ค๋ฉด, (ํ˜‘์—…๊ณผ์ •์—์„œ) ๋™๋ช…์˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 


2 - 2. ์Šค์ฝ”ํ”„, ์Šค์ฝ”ํ”„ ์ฒด์ธ

์Šค์ฝ”ํ”„ scope : ์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜์— ์˜ํ•ด ์Šค์ฝ”ํ”„๊ฐ€ ์ฃผ๋กœ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ES6 ๋ถ€ํ„ฐ๋Š” ๋ธ”๋ก์— ์˜ํ•ด์„œ๋„ ์Šค์ฝ”ํ”„ ๊ฒฝ๊ณ„๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค์ฝ”ํ”„ ๊ฒฝ๊ณ„๋Š” ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋ ๊นŒ์š”?

 

์Šค์ฝ”ํ”„๋ž€ ์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„๋ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.  ์œ ํšจ๋ฒ”์œ„๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ ์ •๋„๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

const a = "a"

const bScope = () => {

	const b = "b"
 	...
     
    }

์ƒ์ˆ˜ a๋กœ ์„ ์–ธํ•œ ์‹๋ณ„์ž์˜ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ๊ณต๊ฐ„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ™”์‚ดํ‘œํ•จ์ˆ˜ bScope ๋‚ด๋ถ€๊นŒ์ง€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰ a ์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„๋Š” ์ „์—ญ๊ณต๊ฐ„  + bScope() ๋‚ด๋ถ€ ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ bScope() ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ b ์‹๋ณ„์ž๋Š”, ํ•ด๋‹น ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. b ์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„๋Š” ๋”ฑ bScope() ๋‚ด๋ถ€์ž…๋‹ˆ๋‹ค.

 

 

2 - 2 - 1. ์Šค์ฝ”ํ”„, ์Šค์ฝ”ํ”„ ์ฒด์ธ, outerEnvironmentReference

Lexical Environment ๋Š” outerEnvironmentReference ์™€ environmentRecord ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

์ด๋ฅผ ์กฐ๊ธˆ ํ’€์–ด ์„ค๋ช…ํ•˜๋ฉด, a ํ•จ์ˆ˜ ๋‚ด๋ถ€์— b ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋ผ ์žˆ๋‹ค๋ฉด, b ํ•จ์ˆ˜์˜ outerEnvironmentReference ๋Š” a ํ•จ์ˆ˜์˜ LexicalEnvironment ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด b ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ, a ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„์— ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๊ธ€๋กœ๋Š” ์ž˜ ์™€๋‹ฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

var a = 1;
var outer = () => {
    var middle = () => {
        console.log('(1)', a);  // (1) undefined
        var a = 3;
        var inner = () => {
            console.log('(2)', a);  // (2) undefined
            var a = 5;
        }
        inner();
    }
    middle();
    console.log('(3)', a);  // (3) 1
}
outer();
console.log('(4)', a);  // (4) 1

middle ํ•จ์ˆ˜๋Š” outer ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ, inner ํ•จ์ˆ˜๋Š” middle ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

outerEnvironmentReference ๋ฅผ ๋Œ€์ž…ํ•ด์„œ ๋งํ•˜๋ฉด,

middle ํ•จ์ˆ˜์˜ outerEnvironmentReference ๋Š” outer ํ•จ์ˆ˜์˜ LexicalEnvironment ๋ฅผ ,
inner ํ•จ์ˆ˜์˜ outerEnvironmentReference ๋Š” middle ํ•จ์ˆ˜์˜ LexicalEnvironment ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

 

๋งˆ์น˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(linked list) ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ๋„๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด outerEnvironmentReference ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” LexicalEnvironment ๊ฐ€ ์–ด์จŒ๋‹ค๋Š” ๊ฑธ๊นŒ์š”?

์šฐ์„  middle ํ•จ์ˆ˜ ๋‚ด๋ถ€์™€ ๊ทธ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ innerํ•จ์ˆ˜๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

middle ํ•จ์ˆ˜์˜ LexicalEnvironment ๋Š” ์šฐ์„  ์‹๋ณ„์ž a ์™€ inner ํ•จ์ˆ˜๋ฅผ EnvironmentRecord ์— ๋‹ด์Šต๋‹ˆ๋‹ค.

inner ํ•จ์ˆ˜์˜ LexicalEnvironment ๋Š” inner() ๋‚ด๋ถ€์˜ ์‹๋ณ„์ž a ๋ฅผ EnvironmentRecord ์— ๋‹ด๊ณ , middle ํ•จ์ˆ˜์˜ LexicalEnvironment ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ outerEnvironmentReference ์— ๋‹ด์Šต๋‹ˆ๋‹ค.

 

inner() ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—๋Š” a ์‹๋ณ„์ž๋ฅผ ์ฝ˜์†”๋กœ๊ทธ์— ์ถœ๋ ฅํ•˜๋ผ๊ณ  ํ•˜์ง€๋งŒ, (ํ˜ธ์ด์ŠคํŒ… ๋œ) a ์‹๋ณ„์ž์—” ์–ด๋– ํ•œ ๊ฐ’๋„ (์•„์ง) ํ• ๋‹น๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— undefined ๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

inner() ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์‹๋ณ„์ž a ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋™์ผํ•œ ์ด๋ฆ„์˜ a ๋ณ€์ˆ˜์—๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ , ์ด๋ฅผ ๋ณ€์ˆ˜ ์€๋‹‰ํ™” ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์— var a = 5 ๋ผ๋Š” ์ฝ”๋“œ๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋์„๊นŒ์š”?

inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์— a ์‹๋ณ„์ž๊ฐ€ ์—†์œผ๋‹ˆ a ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฝ˜์†”๋กœ๊ทธ๋Š” ์—ฌ์ „ํžˆ undefined๋ฅผ ์ถœ๋ ฅํ• ๊นŒ์š”?

์—ฌ๊ธฐ์„œ ์Šค์ฝ”ํ”„์ฒด์ธ๊ณผ outerEnvironmentReferece ๊ฐ€ ํšจ๊ณผ๋ฅผ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค.

// inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์— a๊ฐ€ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
var a = 1;
var outer = () => {
    var middle = () => {
        console.log('(1)', a);  // (1) undefined
        var a = 3;
        var inner = () => {
            console.log('(2)', a);  // (2) 3
        }
        inner();
    }
    middle();
    console.log('(3)', a);  // (3) 1
}
outer();
console.log('(4)', a);  // (4) 1

(2) ๋ถ€๋ถ„์—์„œ a ์˜ ๊ฐ’์€ undefined ๊ฐ€ ์•„๋‹Œ 3์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๋ˆˆ์น˜ ์ฑ„์…จ๊ฒ ์ง€๋งŒ, innerํ•จ์ˆ˜์˜ outerEnvironmentReference๊ฐ€ middle ํ•จ์ˆ˜์˜ LexicalEnvironment ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, middle์˜ LexicalEnvironment ์— ์ €์žฅ๋œ a์˜ ๊ฐ’์ธ 3์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์‹ ์˜ ๋ฒ”์œ„ ๋ฐ”๊นฅ์˜ ์‹๋ณ„์ž a ์— ์ ‘๊ทผํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์—์„œ ๋‚ด๋ถ€๋กœ ์ ‘๊ทผํ•œ ๊ฒƒ์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๊ด€์ ์ž…๋‹ˆ๋‹ค. inner ๋‚ด๋ถ€์— ์žˆ๋Š” ์‹๋ณ„์ž๋ฅผ ๋ฐ”๊นฅ์—์„œ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†์ง€๋งŒ, ์—ญ์œผ๋กœ inner ์™ธ๋ถ€์˜ ์‹๋ณ„์ž๋ฅผ inner ๋‚ด๋ถ€๋กœ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉ(์ ‘๊ทผ)ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ •๋ฆฌ ๋ฐ ์š”์•ฝ

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

2. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment ๋Š” environmentRecord ์™€ outerEnvironmentReference ๋กœ ๊ตฌ์„ฑ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค.

3. environmentRecord ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ช…, ๋ณ€์ˆ˜ ์‹๋ณ„์ž, ํ•จ์ˆ˜๋ช… ๋“ฑ์„ ์ˆ˜์ง‘ํ•˜๋ฉฐ,  outerEnvironmentReference ๋Š” ์ง์ „ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

4. ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๊ฐ’ ํ• ๋‹น์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์ง„ ๋ฌธ์žฅ์€ ์„ ์–ธ๋ถ€๋งŒ์„ ํ˜ธ์ด์ŠคํŒ…ํ•˜๊ณ , ํ• ๋‹น ๊ณผ์ •์€ ์›๋ž˜ ์ž๋ฆฌ์— ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ํ‘œํ˜„์‹๊ณผ ํ•จ์ˆ˜์„ ์–ธ๋ฌธ์˜ ํ˜ธ์ด์ŠคํŒ… ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

 

'๐Ÿ“š Book > Core Javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐ ํƒ€์ž…  (0) 2021.08.14