๐Ÿฏ ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - 02 ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

modoleeยท2020๋…„ 8์›” 30์ผ
4
post-thumbnail

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

Stack, Queue

  • Stack : FILO(First In Last Out), LIFO(Last In First Out)
  • Queue : FIFO(First In First Out), LILO(Last In Last Out)

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

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

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋™์ž‘

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

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•

  • ์ „์—ญ ๊ณต๊ฐ„ โ†’ ์ž๋™ ์‹คํ–‰
  • eval() ํ•จ์ˆ˜ โ†’ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ
  • ํ•จ์ˆ˜ โ†’ ๊ฐ€์žฅ ํ”ํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•
  • ๋ธ”๋ก โ†’ { } ๋กœ ๋‘˜๋Ÿฌ ์Œ“์ธ ์ฝ”๋“œ ๋‚ด๋ถ€. ES6 ๋ถ€ํ„ฐ ์ง€์›

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

์˜ˆ์ œ ์ฝ”๋“œ

// ------------------- (1)
var a = 1;
function outer() {
  function inner() {
    console.log(a);
    var a = 3;
    // --------------- (2)
  }
  inner(); // -------- (3)
  console.log(a);
  // ----------------- (4)
}
outer(); // ---------- (5)
console.log(a);
// ------------------- (6)
  • ์‹คํ–‰ ์ˆœ์„œ : (1) โ†’ (5) โ†’ (3) โ†’ (2) โ†’ (4) โ†’ (6)

์ฝœ์Šคํƒ ๋ณ€ํ™”

ํ™œ์„ฑํ™” ๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ˆ˜์ง‘ ์ •๋ณด

  • VariableEnvironment
    • environmentRecord (snapshot)
    • outerEnvironmentReference (snapshot)
  • LexicalEnvironment
    • environmentRecord
    • outerEnvironmentReference
  • ThisBinding

VariableEnvironment

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

LexicalEnvironment

  • ์ •์˜
    • ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญ ์‹œ '์–ดํœ˜์  ํ™˜๊ฒฝ', '์ •์  ํ™˜๊ฒฝ'์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ชจ๋‘ ์ ์ ˆ์น˜ ์•Š์Œ
    • ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์—๋Š” a, b, c์™€ ๊ฐ™์€ ์‹๋ณ„์ž๋“ค์ด ์žˆ๊ณ , ๊ทธ ์™ธ๋ถ€ ์ •๋ณด๋Š” D๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ๊ตฌ์„ฑ
    • ์œ„์™€ ๊ฐ™์€ ๊ตฌ์„ฑ์ด ๋งˆ์น˜ ์‚ฌ์ „๊ณผ ๋น„์Šทํ•˜์—ฌ '์‚ฌ์ „์  ํ™˜๊ฒฝ'์ด ๋” ์ ํ•ฉํ•œ ํ‘œํ˜„
    • ํ•˜์ง€๋งŒ ๊ทธ๋ƒฅ ์˜๋ฏธ๋งŒ ์ดํ•ดํ•˜๊ณ  ์ง€์นญํ•  ๋•Œ๋Š” LexicalEnvironment๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Œ
  • ๋‚ด๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ : VariableEnvironment์™€ ๋™์ผํ•˜์ง€๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ ๋จ
    • environmentRecord
    • outerEnvironmentReference

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

environmentRecord

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

ํ˜ธ์ด์ŠคํŒ…์˜ ๋“ฑ์žฅ

  • ๋ณ€์ˆ˜ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ณผ์ •์„ ๋งˆ์ณค๋‹ค๋ฉด, ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ด๋ฏธ ํ•ด๋‹น ํ™˜๊ฒฝ์— ์†ํ•œ ์ฝ”๋“œ์˜ ๋ณ€์ˆ˜๋ช…๋“ค์„ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ๊ฒŒ ๋จ
  • '์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์‹๋ณ„์ž๋“ค์„ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด ์˜ฌ๋ ค ๋†“์€ ๋‹ค์Œ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ผ'๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ์ฝ”๋“œ ํ•ด์„์— ๋ฌธ์ œ๊ฐ€ ์—†์Œ
  • ์ด๋Ÿฌํ•œ ๊ณผ์ •์—์„œ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋“ฑ์žฅ

ํ˜ธ์ด์ŠคํŒ…์˜ ๊ฐœ๋…

  • ํ˜ธ์ด์ŠคํŒ…(hoisting) : hoist (๋Œ์–ด ์˜ฌ๋ฆฌ๋‹ค) + ~ing โ†’ ์‹๋ณ„์ž๋“ค์„ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด ์˜ฌ๋ ค ๋†“์ž
  • ๋ณ€์ˆ˜ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ณผ์ •์„ ๋”์šฑ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€์ฒดํ•œ ๊ฐ€์ƒ์˜ ๊ฐœ๋…
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์‹ค์ œ๋กœ ๋Œ์–ด ์˜ฌ๋ฆฌ์ง€๋Š” ์•Š์ง€๋งŒ ํŽธ์˜์ƒ ๋Œ์–ด ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ž๋Š” ๊ฒƒ

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

  • environmentRecord๋Š” ํ˜„์žฌ ์‹คํ–‰ ๋  ์ปจํ…์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ ๋‚ด์— ์–ด๋–ค ์‹๋ณ„์ž๋“ค์ด ์žˆ๋Š”์ง€์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ์ง€, ๊ฐ ์‹๋ณ„์ž๋“ค์ด ์–ด๋–ค ๊ฐ’์ด ํ• ๋‹น ๋ ์ง€์—๋Š” ๊ด€์‹ฌ์ด ์—†์Œ
  • ์˜ˆ์ œ - ์›๋ณธ
function a (x) { // ์ˆ˜์ง‘ ๋Œ€์ƒ 1 (๋งค๊ฐœ ๋ณ€์ˆ˜)
  console.log(x); // (1)
  var x; // ------- ์ˆ˜์ง‘ ๋Œ€์ƒ 2 (๋ณ€์ˆ˜ ์„ ์–ธ)
  console.log(x); // (2)
  var x = 2; // --- ์ˆ˜์ง‘ ๋Œ€์ƒ 3 (๋ณ€์ˆ˜ ์„ ์–ธ)
  console.log(x); // (3)
}

a(1);
  • ํ˜ธ์ด์ŠคํŒ…์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋ชจ๋ฅธ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  (1) ~ (3)์˜ ๊ฐ’์„ ์˜ˆ์ƒํ•ด ๋ณด์ž

    • (1) : ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ ๋œ 1
    • (2) : ์ง€์—ญ๋ณ€์ˆ˜๋กœ x๊ฐ€ ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ undefined
    • (3) : ์ง€์—ญ๋ณ€์ˆ˜ x์— ํ• ๋‹น ๋œ 2
  • ํ•˜์ง€๋งŒ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” 1, 1, 2 ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋จ. ๊ฒฐ๊ณผ ํ™•์ธ

  • ๋งค๊ฐœ ๋ณ€์ˆ˜, ๋ณ€์ˆ˜ ์„ ์–ธ์ด ์–ด๋–ป๊ฒŒ ํ˜ธ์ด์ŠคํŒ… ๋˜๋Š”์ง€ ๊ฐœ๋…์ ์œผ๋กœ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ์˜ˆ์ œ ์ฝ”๋“œ ํ™•์ธ

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

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();
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ํ• ๋‹น๊ณผ ๊ฐ™๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜์—ฌ ๋ณ€ํ™˜ํ•œ ์ƒํƒœ

  • ๊ฒฐ๊ณผ๋Š” ๋™์ผ. ๊ฒฐ๊ณผ ํ™•์ธ

  • ์˜ˆ์ œ - ๋ณ€์ˆ˜ ์„ ์–ธ ๋ถ€๋ถ„๊ณผ ํ• ๋‹น ๋ถ€๋ถ„์„ ๋‚˜๋ˆ  ํ˜ธ์ด์ŠคํŒ…

function a () {
  var x; // -------- ์ˆ˜์ง‘ ๋Œ€์ƒ 1(๋งค๊ฐœ ๋ณ€์ˆ˜)์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ถ€๋ถ„
  var x; // -------- ์ˆ˜์ง‘ ๋Œ€์ƒ 2์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ถ€๋ถ„
  var x; // -------- ์ˆ˜์ง‘ ๋Œ€์ƒ 3์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ถ€๋ถ„
  x = 1; // -------- ์ˆ˜์ง‘ ๋Œ€์ƒ 1์˜ ํ• ๋‹น ๋ถ€๋ถ„
  console.log(x); // (1)
  console.log(x); // (2)
  x = 2; // -------- ์ˆ˜์ง‘ ๋Œ€์ƒ 3์˜ ํ• ๋‹น ๋ถ€๋ถ„
  console.log(x); // (3)
}

a();
  • environmentRecord๋Š” ํ˜„์žฌ ์‹คํ–‰ ๋  ์ปจํ…์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ ๋‚ด์— ์–ด๋–ค ์‹๋ณ„์ž๋“ค์ด ์žˆ๋Š”์ง€์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ ์„ ์–ธ ๋ถ€๋ถ„๋งŒ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋จ
  • ๊ฒฐ๊ณผ๋Š” ๋™์ผ. ๊ฒฐ๊ณผ ํ™•์ธ

ํ˜ธ์ด์ŠคํŒ… ๊ทœ์น™ - ํ•จ์ˆ˜ ์„ ์–ธ์— ๋Œ€ํ•œ ํ˜ธ์ด์ŠคํŒ…

  • ์˜ˆ์ œ - ์›๋ณธ
function a() {
  console.log(b); // (1)
  var b = 'bbb'; // ์ˆ˜์ง‘ ๋Œ€์ƒ 1 (๋ณ€์ˆ˜ ์„ ์–ธ)
  console.log(b); // (2)
  function b() {} // ์ˆ˜์ง‘ ๋Œ€์ƒ 2 (ํ•จ์ˆ˜ ์„ ์–ธ)
  console.log(b); // (3)
}
a();
  • ์ง€๊ธˆ๊นŒ์ง€์˜ ์ง€์‹์„ ๋™์›ํ•ด (1) ~ (3)์„ ์˜ˆ์ƒํ•ด ๋ณด์ž

    • (1) : ๋ณ€์ˆ˜, ํ•จ์ˆ˜์˜ ์„ ์–ธ๋ถ€๊ฐ€ ํ˜ธ์ด์ŠคํŒ… ๋˜์–ด b๊ฐ€ ์„ ์–ธ์€ ๋˜์–ด ์žˆ์œผ๋‚˜ ๊ฐ’์ด ์—†์œผ๋‹ˆ undefined
    • (2) : ๋ฐ”๋กœ ์œ„์—์„œ b์— 'bbb'๋ฅผ ํ• ๋‹น ๋ฐ›์•˜์œผ๋‹ˆ bbb
    • (3) : ๋ฐ”๋กœ ์œ„์— b๋ฅผ ํ•จ์ˆ˜๋กœ ์„ ์–ธ ํ–ˆ์œผ๋‹ˆ function b() {}
  • ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” function b() {}, bbb, bbb ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋จ. ๊ฒฐ๊ณผ ํ™•์ธ

  • ์˜ˆ์ œ - ๋ณ€์ˆ˜ ์„ ์–ธ, ํ•จ์ˆ˜ ์„ ์–ธ ํ˜ธ์ด์ŠคํŒ…

function a() {
  var b; // ------------------- ์ˆ˜์ง‘ ๋Œ€์ƒ 1(๋ณ€์ˆ˜ ์„ ์–ธ) ์˜ ์„ ์–ธ ๋ถ€๋ถ„
  function b() {} // ---------- ์ˆ˜์ง‘ ๋Œ€์ƒ 2(ํ•จ์ˆ˜ ์„ ์–ธ) ์˜ ์ „์ฒด
  // var b = function b() {} // (*) ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ด๋ ‡๊ฒŒ ํ‘œํ˜„๋„ ๊ฐ€๋Šฅ
  console.log(b); // ---------- (1)
  b = 'bbb'; // --------------- ์ˆ˜์ง‘ ๋Œ€์ƒ 1์˜ ํ• ๋‹น ๋ถ€๋ถ„
  console.log(b); // ---------- (2)
  console.log(b); // ---------- (3)
}
a();
  • ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ถ€์™€ ํ• ๋‹น๋ถ€๋ฅผ ๋‚˜๋ˆ  ์„ ์–ธ๋ถ€๋งŒ ๋Œ์–ด์˜ฌ๋ฆฌ์ง€๋งŒ, ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์ „์ฒด๋ฅผ ๋Œ์–ด ์˜ฌ๋ฆผ
  • ํ˜ธ์ด์ŠคํŒ…์ด ๋๋‚œ ์ƒํƒœ์—์„œ์˜ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ (*)๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜๋ช…์œผ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ๊ธธ ์ˆ˜ ์žˆ์Œ
  • ๊ฒฐ๊ณผ๋Š” ๋™์ผ. ๊ฒฐ๊ณผ ํ™•์ธ

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

  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ : ํ•จ์ˆ˜ ์ •์˜๋ถ€๋งŒ ์กด์žฌํ•˜๊ณ  ๋ณ„๋„์˜ ํ• ๋‹น ๋ช…๋ น์ด ์—†๋Š” ๊ฒƒ
    • ํ˜ธ์ด์ŠคํŒ… ์‹œ ํ•จ์ˆ˜ ์ „์ฒด๋ฅผ ๋Œ์–ด ์˜ฌ๋ฆผ
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹ : ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ
    • ์ต๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹ : ํ•จ์ˆ˜๋ช…์„ ์ •์˜ํ•˜์ง€ ์•Š์Œ
    • ๊ธฐ๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹ : ํ•จ์ˆ˜๋ช…์„ ์ •์˜ํ•จ
      • ์™ธ๋ถ€์—์„œ ํ•จ์ˆ˜๋ช…์œผ๋กœ ํ˜ธ์ถœ ๋ถˆ๊ฐ€๋Šฅ
      • ๋‚ด๋ถ€์—์„œ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ. ํ•˜์ง€๋งŒ ๋ณ€์ˆ˜๋ช…์œผ๋กœ๋„ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜์—ฌ ๊ตณ์ด ์“ธ ํ•„์š”๋Š” ์—†์–ด ๋ณด์ž„
      • ํ˜ธ์ด์ŠคํŒ… ์‹œ ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰๋˜์–ด ์„ ์–ธ ๋ถ€๋ถ„๋งŒ ๋Œ์–ด ์˜ฌ๋ฆผ
function a() { /* ... */ } // ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ. ํ•จ์ˆ˜๋ช… a๊ฐ€ ๊ณง ๋ณ€์ˆ˜๋ช…
a(); // ์‹คํ–‰ ๊ฐ€๋Šฅ

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

var c = function d() { /* ... */ } // (๊ธฐ๋ช…) ํ•จ์ˆ˜ ํ‘œํ˜„์‹. ๋ณ€์ˆ˜๋ช…์€ c, ํ•จ์ˆ˜๋ช…์€ d
c(); // ์‹คํ–‰ ๊ฐ€๋Šฅ
d(); // ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅ. ์—๋Ÿฌ!

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

  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์ฝ”๋“œ ์ƒ๋‹จ์— ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋™์ผํ•œ ์ด๋ฆ„์˜ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์ฝ”๋“œ ํ•˜๋‹จ์— ์ค‘๋ณตํ•ด์„œ ์„ ์–ธ ๋  ๊ฒฝ์šฐ.
  • ํ˜ธ์ด์ŠคํŒ… ๊ณผ์ •์—์„œ ๋‘ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด ๋ชจ๋‘ ๋Œ์–ด ์˜ฌ๋ ค์ง€๊ณ , ์ƒ๋Œ€์ ์œผ๋กœ ํ•˜๋‹จ์— ์žˆ๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์ฝ”๋“œ ์ „์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋จ.
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ•˜๋‹จ์˜ ํ•จ์ˆ˜๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „๊นŒ์ง€๋Š” ์ƒ๋‹จ์— ์„ ์–ธ ๋œ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ ๋˜๋‹ค๊ฐ€ ํ•˜๋‹จ์˜ ํ•จ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋ฉด ๊ทธ๋•Œ ๋ถ€ํ„ฐ ํ•˜๋‹จ์˜ ํ•จ์ˆ˜๋กœ ์ ์šฉ ๋จ.
  • ์˜ˆ์ œ - ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
console.log(sum(3, 4)); // (1) : 7์„ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ, 3 + 4 = 7์ด ์ถœ๋ ฅ

function sum(x, y) { // -- ์ƒ๋‹จ ํ•จ์ˆ˜
  return x + y;
}

var a = sum(1, 2);
console.log(a); // ------- (2) : 3์„ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ, 1 + 2 = 3์ด ์ถœ๋ ฅ

function sum(x, y) { // -- ํ•˜๋‹จ ํ•จ์ˆ˜
  return `${x} + ${y} = ${x + y}`;
}

var c = sum(1, 2);
console.log(c); // ------- (3) : 1 + 2 = 3์ด ์ถœ๋ ฅ
// console.log(sum(3, 4)); // (1) : sum์˜ ๊ฐ’์ด ์—†์–ด์„œ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ! 

var sum = function (x, y) { // -- ์ƒ๋‹จ ํ•จ์ˆ˜
  return x + y;
}

var a = sum(1, 2);
console.log(a); // ------- (2) : 3 ์ถœ๋ ฅ

var sum = function (x, y) { // -- ํ•˜๋‹จ ํ•จ์ˆ˜
  return `${x} + ${y} = ${x + y}`;
}

var c = sum(1, 2);
console.log(c); // ------- (3) : 1 + 2 = 3์ด ์ถœ๋ ฅ

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

  • ์Šค์ฝ”ํ”„ (Scope) : ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์œ ํšจ ๋ฒ”์œ„
    • ES5๊นŒ์ง€๋Š” ์ „์—ญ ๊ณต๊ฐ„ ์™ธ์˜ ์˜ค์ง ํ•จ์ˆ˜์— ์˜ํ•ด์„œ๋งŒ ์Šค์ฝ”ํ”„๊ฐ€ ์ƒ์„ฑ
  • ์Šค์ฝ”ํ”„ ์ฒด์ธ (Scope chain) : ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ์•ˆ์—์„œ ๋ถ€ํ„ฐ ๋ฐ”๊นฅ์œผ๋กœ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ
    • ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” ๊ฒƒ์ด outerEnvironmentReference

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

  • ํ˜„์žฌ ์Šค์ฝ”ํ”„์— ์„ ์–ธ ๋œ ์‹๋ณ„์ž์ด ์—†์œผ๋ฉด ์ƒ์œ„ ์Šค์ฝ”ํ”„๋กœ ์ด๋™ํ•˜์—ฌ ๊ฒ€์ƒ‰
  • ์—ฌ๋Ÿฌ ์Šค์ฝ”ํ”„์—์„œ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์„ ์–ธํ•œ ๊ฒฝ์šฐ์—๋Š” ๋ฌด์กฐ๊ฑด ์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋ฐœ๊ฒฌ๋œ ์‹๋ณ„์ž์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ๋ณ€์ˆ˜ ์€๋‹‰ํ™” (Variable shadowing) : ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ์„ ์–ธ๋˜์–ด ์žˆ์ง€๋งŒ, ํ˜„์žฌ ์Šค์ฝ”ํ”„์— ์ด๋ฏธ ์„ ์–ธ๋œ ๊ฒฝ์šฐ์—๋Š” ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ํ˜„์žฌ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ์šฐ์„ ์œผ๋กœ ํ•จ
  • ์˜ˆ์ œ
var a = 1;
var outer = function() {
  var inner = function() {
    console.log(a); // (1)
    var a = 3;
  };
  inner();
  console.log(a); // - (2)
}
outer();
console.log(a); // --- (3)

  • (1) inner ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ์—๋Š” a ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ์•„์ง ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— undefined ์„ ์ถœ๋ ฅ
  • (2) outer ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ์—๋Š” a ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, outerEnvironmentReference๋ฅผ ๋”ฐ๋ผ๊ฐ€์„œ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ a์— ๋“ค์–ด ์žˆ๋Š” 1์„ ์ถœ๋ ฅ
  • (3) ์ „์—ญ ์ปจํ…์ŠคํŠธ์—๋Š” a ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ’์ด ์กด์žฌํ•˜๋ฏ€๋กœ 1 ์„ ์ถœ๋ ฅ
  • ๊ฒฐ๊ณผ ํ™•์ธ

์Šค์ฝ”ํ”„ ์ฒด์ธ ํ™•์ธ - ํฌ๋กฌ ์ „์šฉ

var a = 1;
var outer = function() {
  var b = 2;
  var inner = function() {
    // console.log(b); // 
    console.dir(inner);
  };
  inner();
}
outer();

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

  • ์ „์—ญ๋ณ€์ˆ˜ : ์ „์—ญ ๊ณต๊ฐ„์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜
  • ์ง€์—ญ๋ณ€์ˆ˜ : ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜

this

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

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