Skip to content

Latest commit

ย 

History

History
332 lines (226 loc) ยท 17.8 KB

File metadata and controls

332 lines (226 loc) ยท 17.8 KB

ํด๋กœ์ €

๐Ÿง ํด๋กœ์ €์˜ ์˜๋ฏธ ๋ฐ ์›๋ฆฌ ์ดํ•ด

MDN์—์„œ๋Š” ํด๋กœ์ €๋Š” "ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ lexical environment์˜ ์ƒํ˜ธ๊ด€๊ณ„์— ๋”ฐ๋ฅธ ํ˜„์ƒ" ์ด๋ผ๊ณ  ์†Œ๊ฐœํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.

'์„ ์–ธ๋  ๋‹น์‹œ์˜ LexicalEnvironment'๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ธ outerEnvironmentReference์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

LexicalEnvironment์˜ environmentRecord์™€ outerEnvironmentReference์— ์˜ํ•ด ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„์ธ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋˜๊ณ  ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

  • ํ™˜๊ฒฝ๋ ˆ์ฝ”๋“œ(environmentRecord) - ๋ชจ๋“  ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด. this๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’ ๋“ฑ์˜ ์ •๋ณด๋„ ์ €์žฅ๋จ.

  • ์™ธ๋ถ€ํ™˜๊ฒฝ์ฐธ์กฐ(outerEnvironmentReference) - ์™ธ๋ถ€ ์ฝ”๋“œ์™€ ์—ฐ๊ด€๋˜์–ด ์žˆ์Œ.

์–ด๋–ค ์ปจํ…์ŠคํŠธ A์—์„œ ์„ ์–ธํ•œ ๋‚ด๋ถ€ํ•จ์ˆ˜ B์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์‹œ์ ์—๋Š” B์˜ outerEnvironmentReference๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ์ธ A์˜ LexicalEnvironment์—๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. A์—์„œ๋Š” B์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€๋งŒ B์—์„œ๋Š” A์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ํŒŒ์•…ํ•œ ๋‚ด์šฉ์— ๋”ฐ๋ฅด๋ฉด ํด๋กœ์ €๋ž€, "์–ด๋–ค ํ•จ์ˆ˜์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ" ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋Š”๋ฐ์š”. ์•„์ง ์™€๋‹ฟ์ง€ ์•Š์œผ๋‹ˆ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ข€ ๋” ๋ช…ํ™•ํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ๋ฅผ ๋ณด๊ธฐ ์ „ ์œ„์˜ ๋‚ด์šฉ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ‘์—์„œ ์Šค์ฝ”ํ”„์™€ ์Šค์ฝ”ํ”„์ฒด์ธ, outerEnvironmentReference์— ๋Œ€ํ•ด ์ž ๊น ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

์Šค์ฝ”ํ”„, ์Šค์ฝ”ํ”„ ์ฒด์ธ, outerEnvironmentReference

์Šค์ฝ”ํ”„๋ž€ ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์œ ํšจ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ๊ณ„ A์˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” A์˜ ์™ธ๋ถ€๋ฟ ์•„๋‹ˆ๋ผ A์˜ ๋‚ด๋ถ€์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, A์˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์˜ค์ง A์˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. '์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„'๋ฅผ ์•ˆ์—์„œ๋ถ€ํ„ฐ ๋ฐ”๊นฅ์œผ๋กœ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ LexicalEnvironment์˜ ๋‘ ๋ฒˆ์งธ ์ˆ˜์ง‘์ž๋ฃŒ์ธ outerEnvironmentReference์ž…๋‹ˆ๋‹ค.

1) ์Šค์ฝ”ํ”„ ์ฒด์ธ

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

์˜ˆ๋ฅผ ๋“ค์–ด, Aํ•จ์ˆ˜ ๋‚ด๋ถ€์— Bํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋‹ค์‹œ Bํ•จ์ˆ˜ ๋‚ด๋ถ€์— C ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ ๊ฒฝ์šฐ, ํ•จ์ˆ˜ C์˜ outerEnvironmentReference๋Š” ํ•จ์ˆ˜ B์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ B์˜ LexicalEnvironment์— ์žˆ๋Š” outerEnvironmentReference๋Š” ๋‹ค์‹œ ํ•จ์ˆ˜ B๊ฐ€ ์„ ์–ธ ๋˜๋˜ ๋•Œ(A)์˜ lexicalEnvironment๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

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

๋˜ํ•œ ๊ฐ outerEnvironmentReference๋Š” ์˜ค์ง ์ž์‹ ์ด ์„ ์–ธ๋œ ์‹œ์ ์˜ LexicalEnvironment๋งŒ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์š”์†Œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

// (์‹œ์ž‘)
var a = 1; // (1)

var outer = function() { // (3)
  var inner = function() { // (4) / (6)
    console.log(a); // (7)
    var a = 3; // (8)
  }; // (9)

  inner(); // (5)
  console.log(a); // (10)
} // (11)

outer(); // (2)
console.log(a) // (12)

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

  2. (1) : ์ „์—ญ ์Šค์ฝ”ํ”„์— ์žˆ๋Š” ๋ณ€์ˆ˜ a์— 1์„, outer์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  3. (2) : outer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ ์ฝ”๋“œ๋Š” ์ด ์ค„์—์„œ ์ž„์‹œ ์ค‘๋‹จ๋˜๊ณ , outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด 2๋ฒˆ์งธ ์ค„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

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

  5. (4) : outer ์Šค์ฝ”ํ”„์— ์žˆ๋Š” ๋ณ€์ˆ˜ inner์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  6. (5) : inner ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ฝ”๋“œ๋Š” ์ด ์ค„์—์„œ ์ž„์‹œ ์ค‘๋‹จ๋˜๊ณ , inner ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™” ๋˜์–ด ์„ธ ๋ฒˆ์งธ ์ค„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

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

  8. (7) : ์‹๋ณ„์ž a์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํ™œ์„ฑํ™” ์ƒํƒœ์ธ inner ์ปจํ…์ŠคํŠธ์˜ environmentRecord์—์„œ a๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋ฐœ๊ฒฌํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” ์•„์ง ํ• ๋ต๋œ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. (undefined ์ถœ๋ ฅ)

  9. (8) : inner ํ•จ์ˆ˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. inner ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๊ณ , ๋ฐ”๋กœ ์•„๋ž˜์˜ outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”๋˜๋ฉด์„œ 5)์—์„œ ์ค‘๋‹จํ–ˆ๋˜ ์ค„์˜ ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  10. (9) : inner ํ•จ์ˆ˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. inner ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๊ณ , ๋ฐ”๋กœ ์•„๋ž˜์˜ outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”๋˜๋ฉด์„œ (5)์—์„œ ์ค‘๋‹จํ–ˆ๋˜ ์ค„์˜ ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

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

  12. (11) : outer ํ•จ์ˆ˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. outer ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๊ณ , ๋ฐ”๋กœ ์•„๋ž˜์˜ ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™” ๋˜๋ฉด์„œ 2)์—์„œ ์ค‘๋‹จํ–ˆ๋˜ ์ค„์˜ ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  13. (12) : ์‹๋ณ„์ž a์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํ™œ์„ฑํ™” ์ƒํƒœ์ธ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ environmentRecord์—์„œ a๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉฐ ๋ฐ”๋กœ a๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(1 ์ถœ๋ ฅ). ์ด๋กœ์จ ๋ชจ๋“  ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์–ด ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๊ณ  ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

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

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

์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๊นŒ์ง€ ํƒ์ƒ‰ํ•ด๋„ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํด๋กœ์ €

๋‹ค์‹œ ํด๋กœ์ €๋กœ ๋Œ์•„์™€, ์™ธ๋ถ€ํ•จ์ˆ˜์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜(1)

var outer = function() {
  var a = 1;
  var inner = function() {
    console.log(++a);
  };
  inner();
}
outer();

// -- ๊ฒฐ๊ณผ --
// 2

์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” outer ํ•จ์ˆ˜์—์„œ ๋ณ€์ˆ˜ a๋ฅผ ์„ ์–ธํ–ˆ๊ณ , outer์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜์ธ inner ํ•จ์ˆ˜์—์„œ a์˜ ๊ฐ’์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ ๋‹ค์Œ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” a๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— environmentRecord์—์„œ ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฏ€๋กœ outerEnvironmentReference์— ์ง€์ •๋œ ์ƒ์œ„ ์ปจํ…์ŠคํŠธ outer์˜ LexicalEnvironment์— ์ ‘๊ทผํ•˜์—ฌ ๋‹ค์‹œ a๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋„ค ๋ฒˆ์งธ ์ค„์—์„œ๋Š” 2๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด LexicalEnvironment์— ์ €์žฅ๋œ ์‹๋ณ„์ž๋“ค(a, inner)์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ ์ฃผ์†Œ์— ์ €์žฅ๋ผ ์žˆ๋˜ ๊ฐ’๋“ค์€ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋„ ์—†๊ฒŒ ๋˜๋ฏ€๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์ˆ˜์ง‘ ๋Œ€์ƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด์šฉ์„ ์กฐ๊ธˆ ๋ฐ”๊พผ ๋ฐ‘ ์˜ˆ์ œ๋ฅผ ์ด์–ด์„œ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜(2)

var outer = function() {
  var a = 1;
  var inner = function() {
    return ++a;
  }
  return inner(); // inner ํ•จ์ˆ˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
};

var outer2 = outer();
console.log(outer2);

// -- ๊ฒฐ๊ณผ --
// 2

์œ„ ์ฝ”๋“œ์—์„œ๋„ inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€ ๋ณ€์ˆ˜์ธ a๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ 6๋ฒˆ์งธ ์ค„์—์„œ๋Š” inner ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋œ ์‹œ์ ์—๋Š” a๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ์ด ์—†์–ด์ง‘๋‹ˆ๋‹ค. a, inner ๋ณ€์ˆ˜์˜ ๊ฐ’๋“ค์€ ์–ธ์  ๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์†Œ๋ฉธํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ (1), (2) ์˜ˆ์ œ๋Š” outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ด์ „์— inner ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋ผ ์žˆ์œผ๋ฉฐ, ์ดํ›„ ๋ณ„๋„๋กœ inner ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด outer์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ inner ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋ฐ‘์˜ (3) ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜(3)

var outer = function() {
  var a = 1;
  var inner = function() {
    return ++a;
  }
  return inner; // inner ํ•จ์ˆ˜ ์ž์ฒด ๋ฐ˜ํ™˜
};

var outer2 = outer();
console.log(outer2());
console.log(outer2());

// -- ๊ฒฐ๊ณผ --
// 2
// 3

์ด๋ฒˆ์—๋Š” 6๋ฒˆ์งธ ์ค„์—์„œ inner ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ inner ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ outer2 ๋ณ€์ˆ˜๋Š” outer์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ์ธ inner ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ดํ›„ 9๋ฒˆ์งธ ์ค„์—์„œ outer2๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•ž์„œ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜์ธ inner๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

inner ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ environmentRecord์—๋Š” ์ˆ˜์ง‘ํ•  ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. outerEnvironmentReference์—๋Š” inner ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์œ„์น˜์˜ LexicalEnvironment๊ฐ€ ์ฐธ์กฐ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. inner ํ•จ์ˆ˜๋Š” outer ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋์œผ๋ฏ€๋กœ, outer ํ•จ์ˆ˜์˜ LexicalEnvironment๊ฐ€ ๋‹ด๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ์Šค์ฝ”ํ”„ ์ฒด์ด๋‹์— ๋”ฐ๋ผ outer์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ a์— ์ ‘๊ทผํ•˜์—ฌ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ ํ›„ ๊ทธ ๊ฐ’์ธ 2๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , inner ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ outer2๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ a์˜ ๊ฐ’์„ 2์—์„œ 3์œผ๋กœ 1 ์ฆ๊ฐ€์‹œํ‚จ ํ›„ 3์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

โ“โ“โ“

์—ฌ๊ธฐ์„œ, inner ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์‹œ์ ์—๋Š” outer ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ์‹คํ–‰์ด ์ข…๋ฃŒ๋œ ์ƒํƒœ์ธ๋ฐ ์–ด๋–ป๊ฒŒ outer ํ•จ์ˆ˜์˜ LexicalEnvironment์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑธ๊นŒ์š”?

์ด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ๋™์ž‘ ๋ฐฉ์‹ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์–ด๋–ค ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์€ ์ˆ˜์ง‘ ๋Œ€์ƒ์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ์ œ์—์„œ outer ํ•จ์ˆ˜๋Š” ์‹คํ–‰ ์ข…๋ฃŒ ์‹œ์ ์— inner ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ํ•จ์ˆ˜์ธ outer์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ๋‚ด๋ถ€ ํ•จ์ˆ˜์ธ innerํ•จ์ˆ˜๋Š” ์–ธ์  ๊ฐ€ outer2๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ํ˜ธ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์—ด๋ฆฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€ inner ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด outerEnvironmentReference๊ฐ€ outer ํ•จ์ˆ˜์˜ LexicalEnvironment๋ฅผ ํ•„์š”๋กœ ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์ˆ˜์ง‘ ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— inner ํ•จ์ˆ˜๊ฐ€ ์ด ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘€๐Ÿ‘€

ํด๋กœ์ €๋Š” ์–ด๋–ค ํ•จ์ˆ˜์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์ด๋ผ๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ(3)์˜ ๊ฒฝ์šฐ๋Š” ๋ณ€์ˆ˜ a๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ์ˆ˜์ง‘ ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋์Šต๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ LexicalEnvironment๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์ˆ˜์ง‘ ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์˜ˆ์ œ(3)๊ณผ ๊ฐ™์ด ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€๋กœ ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ๊ฐ€ ์œ ์ผํ•ฉ๋‹ˆ๋‹ค.

"์–ด๋–ค ํ•จ์ˆ˜์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ"์ด๋ž€ "์™ธ๋ถ€ ํ•จ์ˆ˜์˜ LexicalEnvironment๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ"์„ ๋งํ•˜๋Š” ๊ฒƒ์ด๊ฒ ์ฃ .

์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํด๋กœ์ €์˜ ์ •์˜๋ฅผ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

ํด๋กœ์ €๋ž€ ์–ด๋–ค ํ•จ์ˆ˜ A์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ a๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜ B๋ฅผ ์™ธ๋ถ€๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ A์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์—๋„ ๋ณ€์ˆ˜ a๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ํ˜„์ƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค

๋‹ค๋ฅธ ์„œ์ ๋“ค์—์„œ๋Š” ํด๋กœ์ €๋ฅผ ์ด๋ ‡๊ฒŒ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ๋งŒ๋“ค์–ด์ง€๋Š” ์œ ํšจ๋ฒ”์œ„๊ฐ€ ์‚ฌ๋ผ์ง„ ํ›„์—๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ - <<์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‹Œ์ž ๋น„๊ธ‰. ์ธ์‚ฌ์ดํŠธ>>

  • ์ด๋ฏธ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ๋๋‚œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•จ์ˆ˜ - <<์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ.ํ•œ๋น›๋ฏธ๋””์–ด>>

  • ์ž์‹ ์ด ์ƒ์„ฑ๋  ๋•Œ์˜ ์Šค์ฝ”ํ”„์—์„œ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ณ€์ˆ˜๋“ค ์ค‘ ์–ธ์  ๊ฐ€ ์ž์‹ ์ด ์‹คํ–‰๋  ๋•Œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋“ค๋งŒ์„ ๊ธฐ์–ตํ•˜์—ฌ ์œ ์ง€์‹œํ‚ค๋Š” ํ•จ์ˆ˜ - <<ํ•จ์ˆ˜ํ˜• ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ.์ธ์‚ฌ์ดํŠธ>>

โ—โ—โ—

์ฃผ์˜ํ•  ์ ์ด ํ•œ ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ '์™ธ๋ถ€๋กœ ์ „๋‹ฌ'์ด ๊ณง return๋งŒ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ฐ‘์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// return ์—†์ด๋„ ํด๋กœ์ €๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ
// setInterval / setTimeout

(function() {
  var a = 0;
  var intervalId = null;
  var inner = function() {
    if(++a >= 10) {
      clearInterval(intervalId);
    }
    console.log(a);
  };
  intervalId = setInterval(inner, 1000);
})

// -- ๊ฒฐ๊ณผ --
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10

์œ„์˜ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ์™ธ๋ถ€๊ฐ์ฒด์ธ window์˜ ๋ฉ”์„œ๋“œ(setTimeout ๋˜๋Š” setInterval)์— ์ „๋‹ฌํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

// return ์—†์ด๋„ ํด๋กœ์ €๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ
// eventListener

(function() {
  var count = 0;
  var button = document.createElement("button");
  button.innerText = "Click";
  button.addEventListener("click", function() {
    console.log(++count, "times clicked!");
  });
  document.body.appendChild(button);
})

// -- ๊ฒฐ๊ณผ --
// 1 "times clicked!"
// 2 "times clicked!"
// 3 "times clicked!"
// 4 "times clicked!"
// ...

์œ„์˜ ๋‘ ๋ฒˆ์งธ ์˜ˆ์ œ์—์„œ๋Š” ๋ณ„๋„์˜ ์™ธ๋ถ€๊ฐ์ฒด์ธ DOM์˜ ๋ฉ”์„œ๋“œ(addEventListener)์— ๋“ฑ๋กํ•  handler ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ง€์—ญ๋ฒˆ์ˆ˜๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

๋‘ ์˜ˆ์‹œ ์ฝ”๋“œ ๋ชจ๋‘ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€์— ์ „๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋กœ์ €์ž…๋‹ˆ๋‹ค.

๐Ÿง ํด๋กœ์ €์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์œ„ํ—˜์„ ์ด์œ ๋กœ ํด๋กœ์ € ์‚ฌ์šฉ์„ ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋„ ์žˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ๋Š” ํด๋กœ์ €์˜ ๋ณธ์งˆ์ ์ธ ํŠน์„ฑ์ผ ๋ฟ, ์˜คํžˆ๋ ค ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ฑ…์—์„œ ์ €์ž๊ฐ€ ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

ํด๋กœ์ €๋Š” ์–ด๋–ค ํ•„์š”์— ์˜ํ•ด ์˜๋„์ ์œผ๋กœ ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์ง„ ์‹œ์ ์—์„œ ๋”๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜์ง€ ์•Š๊ฒŒ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค๋ฉด ์–ธ์  ๊ฐ€ GC๊ฐ€ ์ˆ˜๊ฑฐํ•ด๊ฐˆ ๊ฒƒ์ด๊ณ , ์†Œ๋ชจ๋๋˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํšŒ์ˆ˜๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ 0์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ์‹๋ณ„์ž์— ์ฐธ์กฐํ˜•์ด ์•„๋‹Œ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ(๋ณดํ†ต null์ด๋‚˜ undefined)๋ฅผ ํ• ๋‹นํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐ‘์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์œ„์—์„œ ์‚ดํŽด๋ณธ return ์—†์ด๋„ ํด๋กœ์ €๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์˜ˆ์‹œ๋“ค์— ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

// return์— ์˜ํ•œ ํด๋กœ์ €์˜ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ

var outer = (function() {
  var a = 1;
  var inner = function() {
    return ++a;
  };
  return inner;
})();

console.log(outer());
console.log(outer());
outer = null; // outer ์‹๋ณ„์ž์˜ inner ํ•จ์ˆ˜ ์ฐธ์กฐ๋ฅผ ๋Š์Œ
// setInterval์— ์˜ํ•œ ํด๋กœ์ €์˜ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ

(function() {
  var a = 0;
  var intervalId = null;
  var inner = function() {
    if(++a >= 10) {
      clearInterval(intervalId);
      inner = null; // inner ์‹๋ณ„์ž์˜ ํ•จ์ˆ˜ ์ฐธ์กฐ๋ฅผ ๋Š์Œ
    }
    console.log(a);
  };
  intervalId = setInterval(inner, 1000);
})
// eventListener์— ์˜ํ•œ ํด๋กœ์ €์˜ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ

(function() {
  var count = 0;
  var button = document.createElement("button");
  button.innerText = "Click";
  
  var clickHandler = function() {
    console.log(++count, "times clicked!");
    if(count >= 10) {
      button.removeEventListener("click", clickHandler);
      clickHandler = null; // clickHandler ์‹๋ณ„์ž์˜ ํ•จ์ˆ˜ ์ฐธ์กฐ๋ฅผ ๋Š์Œ.
    }
  };

  button.addEventListener("click", clickHandler);
  document.body.appendChild(button);
}

๋งˆ์น˜๋ฉฐ

...?