๐Ÿค” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ & ์Šค์ฝ”ํ”„ ์ฒด์ธ & ํ˜ธ์ด์ŠคํŒ… & ํด๋กœ์ €์— ๋Œ€ํ•ด์„œ

๋ฐ•์ƒ์€ยท2022๋…„ 6์›” 19์ผ
0

๐Ÿ“€ JavaScript ๐Ÿ“€

๋ชฉ๋ก ๋ณด๊ธฐ
1/12
post-thumbnail

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive 23~24์žฅ์„ ์ฝ์œผ๋ฉด์„œ ์ดํ•ดํ•œ ๋Œ€๋กœ ์ •๋ฆฌํ•˜๋Š” ํฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘€ ์„ค๋ช…์— ์‚ฌ์šฉํ•  ์˜ˆ์‹œ ์ฝ”๋“œ

// x, y๋Š” ํ˜ธ์ด์ŠคํŒ… ๋จ
// x๋Š” undefined
// y๋Š” <uninitialized>
var x = 1;
const y = 2;

function outer(a) {
  var x = 3;
  const y = 4;

  function inner() {
    // ์Šค์ฝ”ํ”„ ์ฒด์ธ์— ์˜ํ•ด์„œ x, y ๊ฐ’์„ ์–ป์Œ
    console.log(x, y);	// 3 4
  }

  return inner;
}

var func = outer();

// ํด๋กœ์ €์— ์˜ํ•ด์„œ outer() ๋‚ด๋ถ€์˜ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•จ
func();

๐Ÿง ์ „์ฒด ์„ค๋ช…

โœ๏ธ ์ฃผ์š” ๊ฐœ๋…๋“ค

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

  2. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ: ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‹ด๋Š” ์Šคํƒ์œผ๋กœ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    ( ํ•ญ์ƒ ์ตœ์ƒ์œ„์— ์กด์žฌํ•˜๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ˜„์žฌ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์ด๋‹ค. )

  3. ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ: ์Šค์ฝ”ํ”„์— ํฌํ•จ๋œ ์‹๋ณ„์ž๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๋“ฑ๋ก๋œ ์‹๋ณ„์ž์— ๋ฐ”์ธ๋”ฉ ๋œ ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค.

  4. ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ: ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๐Ÿ™‚ ํ‚ค์›Œ๋“œ

1. ํ˜ธ์ด์ŠคํŒ…

ํ˜ธ์ด์ŠคํŒ…์„ ์„ค๋ช…ํ•  ๋• ์ฃผ๋กœ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์„ ๋Œ์–ด์˜ฌ๋ ค์„œ ์ตœ์ƒ์œ„์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ "์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ"์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ด ๋ง์€ ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

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

ํ•จ์ˆ˜๋Š” ์ƒ๊ด€์—†์ง€๋งŒ, ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์€ ๋“ฑ๋ก๋งŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— undefined๋‚˜ uninitialized์˜ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋„ ํ˜ธ์ด์ŠคํŒ…์— ์˜ํ•ด์„œ undefined๋ฅผ ๊ฐ€์งˆ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๊ณ , uninitialized์ผ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

uninitialized๋ฅผ ๊ฐ€์ ธ์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•ด์„œ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
uninitialized์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ˜ธ์ด์ŠคํŒ…์ด ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var์ผ ๊ฒฝ์šฐ undefined๋กœ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๋˜๊ณ ,
let, const์ผ ๊ฒฝ์šฐ uninitialized๋กœ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” ๋ฉ๋‹ˆ๋‹ค.
์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ด์œ ๋Š” ์“ฐ๋ ˆ๊ธฐ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ์„ ํ™•๋ฅ ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ํ˜„์žฌ ์Šค์ฝ”ํ”„์— ์กด์žฌํ•˜๋Š” ์˜์—ญ์ด ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์‹๋ณ„์ž๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ๋Š” ํ˜„์žฌ ์Šค์ฝ”ํ”„์—์„œ ์‹๋ณ„์ž๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ƒ์œ„ ์Šค์ฝ”ํ”„์—์„œ ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์Šค์ฝ”ํ”„๋ฅผ ๋จผ์ € ๊ฒ€์ƒ‰ํ•˜๋ฏ€๋กœ ์Šค์ฝ”ํ”„๋งˆ๋‹ค ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด๋„ ํ˜„์žฌ ์Šค์ฝ”ํ”„๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•ด ๊ฐ€๊นŒ์šด ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ๋Š” ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ( Outer Lexical Environment Reference ) ๋•๋ถ„์ž…๋‹ˆ๋‹ค.
์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์—์„œ ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์ƒ์œ„ ์Šค์ฝ”ํ”„ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ์— ์ ‘๊ทผํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ํด๋กœ์ €

์ œ๊ฐ€ ์ดํ•ดํ•œ ๋Œ€๋กœ ํด๋กœ์ €๋ฅผ ์ •์˜ํ•˜์ž๋ฉด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ์†ํ•˜๋Š” ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ func()๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— outer()๋Š” ์ด๋ฏธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ ์ œ๊ฑฐ๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ outer()์— ์†ํ•˜๋Š” ์‹๋ณ„์ž์ธ x์™€ y๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฐ ์ƒํ™ฉ์„ ํด๋กœ์ €๋ผ๊ณ  ์ดํ•ดํ–ˆ๋Š”๋ฐ ์ด๊ฒƒ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์„ ํ–‰์ง€์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. JavaScript์˜ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด์ด๋‹ค. ( ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, ๋ณ€์ˆ˜์— ํ• ๋‹น ๊ฐ€๋Šฅ )
  2. ํŠน์ • ์‹๋ณ„์ž์— ์ ‘๊ทผํ•  ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค๋ฉด ํ•ด๋‹น ์‹๋ณ„์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ•ด์ œ๋˜์ง€ ์•Š๋Š”๋‹ค. ( ์ด๊ฑฐ ์ž˜๋ชปํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ์ด ๋ฐœ์ƒ... ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด null์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ )
  3. ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ( [[Environment]] )

outer()์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ์˜ํ•ด์„œ inner()๊ฐ’์„ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์ธ func์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  outer()๊ฐ€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋์–ด๋„ func() -> inner()์˜ [[Environment]] -> outer()์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ์˜ํ•ด์„œ outer()์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ func()๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ํ•œ outer()๊ฐ€ ํ• ๋‹น ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ func()๋ฅผ ์ด์šฉํ•ด์„œ outer()์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ํด๋กœ์ €๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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