Skip to content

Latest commit

ย 

History

History
300 lines (202 loc) ยท 12.5 KB

File metadata and controls

300 lines (202 loc) ยท 12.5 KB

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ƒ์„ฑ ๊ณผ์ •

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ณผ์ •์„ ์•Œ์•„๋ณธ๋‹ค. [[Scopes]] ํ”„๋กœํผํ‹ฐ, ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…, ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

์•„๋ž˜์˜ ์ฝ”๋“œ๋กœ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

var x = 'xxx';

function foo () {
  var y = 'yyy';

  function bar () {
    var z = 'zzz';
    console.log(x + y + z);
  }
  bar();
}

foo();

๐Ÿ“Œ 1. ์ „์—ญ ์ฝ”๋“œ (Global Code)๋กœ ์ง„์ž…

  • ์ปจํŠธ๋กค์ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ์ง„์ž…ํ•˜๊ธฐ ์ „์— ์ „์—ญ๊ฐ์ฒด(Global Object/GO)๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • ์ „์—ญ๊ฐ์ฒด๋Š” ์œ ์ผํ•˜๋ฉฐ, ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋Š” ์ฝ”๋“œ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ดˆ๊ธฐ ์ƒํƒœ์—๋Š” ๋นŒํŠธ์ธ ๊ฐ์ฒด์ธ Math, String, Array ๋“ฑ๊ณผ BOM, DOM์ด ์„ค์ •๋˜์–ด ์žˆ๋‹ค.
  • ์ „์—ญ ์ฝ”๋“œ๋กœ ์ปจํŠธ๋กค์ด ์ง„์ž…ํ•˜๋ฉด, ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์— ์Œ“์ธ๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ธ, ๋ณ€์ˆ˜ ๊ฐ์ฒด, this value๊ฐ€ ์žˆ๋‹ค. ์ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์Œ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค. (1 -> 2 -> 3)

  1. ์Šค์ฝ”ํ”„์ฒด์ธ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”
  2. ๋ณ€์ˆ˜ ๊ฐ์ฒดํ™” ์‹คํ–‰
  3. this value ๊ฒฐ์ •

1-1. ์Šค์ฝ”ํ”„์ฒด์ธ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”

์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜ ๊ฐ์ฒด ์ฐธ์กฐ์˜ ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ ํ›„, ๊ฐ€์žฅ ๋จผ์ € ์Šค์ฝ”ํ”„์ฒด์ธ์˜ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ์ „์—ญ ๊ฐ์ฒด(GO)์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋œ๋‹ค.

1-2. ๋ณ€์ˆ˜ ๊ฐ์ฒดํ™”(Variable Instantiation) ์‹คํ–‰

  • ๋ณ€์ˆ˜ ๊ฐ์ฒดํ™”๋Š” ๋ณ€์ˆ˜ ๊ฐ์ฒด(VO)์— ํ”„๋กœํผํ‹ฐ์™€ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ „์—ญ ์ฝ”๋“œ์˜ VO๋Š” ์ „์—ญ ๊ฐ์ฒด Global Object(GO)๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ธ์ˆ˜ ์ •๋ณด, ํ•จ์ˆ˜ ์„ ์–ธ, ๋ณ€์ˆ˜๋ฅผ VO์— ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ์ฒดํ™”ํ•œ๋‹ค.

  • ๋ณ€์ˆ˜ ๊ฐ์ฒดํ™” ์ˆœ์„œ

    1. ๋งค๊ฐœ ๋ณ€์ˆ˜์™€ ์ธ์ˆ˜ ์ •๋ณด ์ถ”๊ฐ€

      ํ•จ์ˆ˜ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, VO์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜(parameter), ๊ฐ’์œผ๋กœ argument๊ฐ€ ์„ค์ •๋œ๋‹ค.

      ์ „์—ญ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ด ๊ณผ์ •์€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

    2. ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

      ์ฝ”๋“œ ๋‚ด์˜ ํ•จ์ˆ˜ ์„ ์–ธ(ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์ œ์™ธ)์„ ๋Œ€์ƒ์œผ๋กœ VO์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ•จ์ˆ˜๋ช…, ๊ทธ ๊ฐ’์œผ๋กœ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜ ๊ฐ์ฒด ๊ฐ€ ์„ค์ •๋œ๋‹ค.

    3. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

      ์ฝ”๋“œ ๋‚ด์˜ ๋ณ€์ˆ˜ ์„ ์–ธ์„ ๋Œ€์ƒ์œผ๋กœ VO์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋ณ€์ˆ˜๋ช…, ๊ฐ’์œผ๋กœ undefined๊ฐ€ ์„ค์ •๋œ๋‹ค.

์ „์—ญ์ฝ”๋“œ์ด๋ฏ€๋กœ, 1์€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ์ „์—ญ ํ•จ์ˆ˜์ธ foo ์„ ์–ธ์ด ์ฒ˜๋ฆฌ๋˜๊ณ , ๊ทธ ํ›„ ์ „์—ญ ๋ณ€์ˆ˜์ธ x์˜ ์„ ์–ธ์ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

1-2-1 ํ•จ์ˆ˜ foo ์ฒ˜๋ฆฌ - foo ํ•จ์ˆ˜ ์ƒ์„ฑ

  • foo ํ•จ์ˆ˜ ์ƒ์„ฑ์œผ๋กœ VO์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ•จ์ˆ˜ ์ด๋ฆ„์ธ foo๊ฐ€, ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ์„ค์ •๋œ๋‹ค.

  • ์ด ๋•Œ, foo ํ•จ์ˆ˜์˜ [[Scopes]]๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    foo.[[Scopes]] = [ globalContext.VO ]

  • ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ [[Scopes]]ํ”„๋กœํผํ‹ฐ

    • ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์ธ [[Scopes]] ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.
    • ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
    • [[Scopes]] ํ”„๋กœํผํ‹ฐ๋Š” ์ž์‹ ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ Lexical Environment์™€ ์ž์‹ ์„ ํฌํ•จํ•˜๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์ธ AO์™€ ์ „์—ญ ๊ฐ์ฒด(Global Object)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.
    • ์ด ๋•Œ, ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์†Œ๋ฉธํ•˜์—ฌ๋„ [[Scopes]]๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์—ฌ์ „ํžˆ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํด๋กœ์ €๋ผ๊ณ  ํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ… ํ•จ์ˆ˜ ์„ ์–ธ์‹ ์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ๊ฐ์ฒด์— ํ•จ์ˆ˜๋ช…์„ ํ”„๋กœํผํ‹ฐ๋กœ, ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ’์œผ๋กœ ํ• ๋‹น๋œ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•จ์ˆ˜ ์„ ์–ธ์‹์€ ์„ ์–ธ๋ฌธ ์ด์ „์— ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

hello(); // hello
function hello() { // ํ•จ์ˆ˜ ์„ ์–ธ์‹
  console.log("hello");
}

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ•จ์ˆ˜ ๊ฐ์ฒด์— ํ•จ์ˆ˜๋ช…์„ ํ”„๋กœํผํ‹ฐ๋กœ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ, ๊ทธ ๋ฐฉ์‹์€ ์ผ๋ฐ˜ ๋ณ€์ˆ˜์˜ ๋ฐฉ์‹ ์„ ๋”ฐ๋ฅธ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ์„ ์–ธ๋ฌธ ์ด์ „์— ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

1-2-2 ๋ณ€์ˆ˜ x ์ฒ˜๋ฆฌ

๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜๋ช…์ด VO์˜ ํ”„๋กœํผํ‹ฐ๋กœ, undefined๊ฐ€ ๊ฐ’์œผ๋กœ ์„ค์ •๋œ๋‹ค. ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ๋Š” ๋‹ค์Œ ์„ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰˜์–ด์„œ ์ด๋ฃจ์–ด์ง„๋‹ค.

1. ์„ ์–ธ ๋‹จ๊ณ„

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

    2. ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„

  • ๋ณ€์ˆ˜ ๊ฐ์ฒด์— ๋“ฑ๋ก๋œ ๋ณ€์ˆ˜๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•œ๋‹ค.

  • ์ด ๋‹จ๊ณ„์—์„œ ๋ณ€์ˆ˜๋Š” undefined๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

    3. ํ• ๋‹น ๋‹จ๊ณ„

  • ์‹ค์ œ ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์Šค์ฝ”ํ”„ ์ดˆ๊ธฐ์— ์„ ์–ธ ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ํ•œ ๋ฒˆ์— ์ด๋ฃจ์–ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ, ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜์—ฌ๋„ VO์— ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ณ , ๋ฉ”๋ชจ๋ฆฌ์—๋„ ํ• ๋‹น๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

// ์Šค์ฝ”ํ”„์˜ ์ดˆ๊ธฐ์— ์„ ์–ธ ๋‹จ๊ณ„(1)์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„(2)๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
console.log(hello); // undefined
var hello;          // ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ
console.log(hello); // undefined

hello = "hello";    // ํ• ๋‹น๋ฌธ -> ํ• ๋‹น ๋‹จ๊ณ„(3)๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
console.log(hello); // hello

๋‹ค๋งŒ, ์•„์ง ๋ณ€์ˆ˜ x๋Š” 'xxx'๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๊ณ , ๋ณ€์ˆ˜ ํ• ๋‹น๋ฌธ์— ๋„๋‹ฌํ•˜๋ฉด ๊ฐ’์˜ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

์œ„์—์„œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ์ผ๋ฐ˜ ๋ณ€์ˆ˜์˜ ๋ฐฉ์‹์„ ๋”ฐ๋ฅธ๋‹ค๊ณ  ํ•˜์˜€๋‹ค. ๋”ฐ๋ผ์„œ, var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ์„ ์–ธ๋ฌธ ์ด์ „์— ํ˜ธ์ถœํ•˜๋ฉด, undefined๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

console.log(bye); // undefined
var bye = function () {
  // ํ•จ์ˆ˜ ํ‘œํ˜„์‹
  console.log("bye");
};
  • const, let ํ‚ค์›Œ๋“œ์˜ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

    ํ•จ์ˆ˜ ํ‘œํ˜„์‹๊ณผ ๋ณ€์ˆ˜๊ฐ€ const๋‚˜ let์œผ๋กœ ํ• ๋‹น๋œ๋‹ค๋ฉด, ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์„ ์–ธ๋ฌธ ์ด์ „์— ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ•˜๋ฉด, Reference Error๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Š” const๋‚˜ let์œผ๋กœ ํ• ๋‹นํ•œ ๋ณ€์ˆ˜๋Š” ์Šค์ฝ”ํ”„ ์ดˆ๊ธฐ์— ์„ ์–ธ ๋‹จ๊ณ„๋งŒ ์ผ์–ด๋‚˜๊ณ , ์„ ์–ธ๋ฌธ์— ๋„๋‹ฌํ•ด์•ผ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์„ ์–ธ๋ฌธ ์ด์ „์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ์— ํ•ด๋‹น ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— Reference Error๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

console.log(goodBye); // ReferenceError: Cannot access 'goodBye' before initialization

const goodBye = function () {
  // ํ•จ์ˆ˜ ํ‘œํ˜„์‹
  console.log("goodBye");
};

1-3 this value ๊ฒฐ์ •

๋ณ€์ˆ˜ ์„ ์–ธ ์ฒ˜๋ฆฌ ํ›„, this value๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค.

  • this value๊ฐ€ ๊ฒฐ์ •๋˜๊ธฐ ์ „์— this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค๊ฐ€, ํ•จ์ˆ˜ ํ˜ธ์ถœ ํŒจํ„ด์— ์˜ํ•ด this์— ํ• ๋‹น๋˜๋Š” ๊ฐ’์ด ๊ฒฐ์ •๋œ๋‹ค.

  • ์ „์—ญ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, VO, ์Šค์ฝ”ํ”„ ์ฒด์ธ, this๋Š” ํ•ญ์ƒ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๐Ÿ“Œ 2. ์ „์—ญ ์ฝ”๋“œ ์‹คํ–‰

์ง€๊ธˆ๊นŒ์ง€๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์œ„ํ•œ ์ค€๋น„ ๊ณผ์ •์ด์—ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ์ฝ”๋“œ๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.

var x = 'xxx';

function foo () {
  var y = 'yyy';

  function bar () {
    var z = 'zzz';
    console.log(x + y + z);
  }
  bar();
}

foo()

์œ„ ์˜ˆ์ œ์—์„œ๋Š” ๋ณ€์ˆ˜ x์— 'xxx'ํ• ๋‹น๊ณผ ํ•จ์ˆ˜ foo์˜ ํ˜ธ์ถœ์ด ์‹คํ–‰๋œ๋‹ค.

2-1. ๋ณ€์ˆ˜ x์— ๊ฐ’ ํ• ๋‹น

ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ VO๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ–๊ณ  ์žˆ๋‹ค. 0๋ฒˆ์งธ VO๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋ณ€์ˆ˜๋ช… x์— ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด, ๊ทธ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’ 'xxx'๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

2-2. ํ•จ์ˆ˜ foo ํ˜ธ์ถœ

  • ํ•จ์ˆ˜ foo๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ๊ธฐ๊ณ , ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์— push๋œ๋‹ค.
  • ์ปจํŠธ๋กค์ด ํ•จ์ˆ˜ foo์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋กœ ์ด๋™ํ•˜๋ฉด, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 1. ์Šค์ฝ”ํ”„ ์ฒด์ธ์˜ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”, 2. ๋ณ€์ˆ˜ ๊ฐ์ฒดํ™” ์‹คํ–‰ 3. this value ๊ฒฐ์ •์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
  • ๋‹จ, ์ด ์ฝ”๋“œ๋Š” ์ „์—ญ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ์ฝ”๋“œ์ด๋ฏ€๋กœ, ํ•จ์ˆ˜ ์ฝ”๋“œ์˜ ๋ฃฐ์ด ์ ์šฉ๋œ๋‹ค.

2-2-1. ์Šค์ฝ”ํ”„ ์ฒด์ธ์˜ ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™”

ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ Scope = AO + [[Scopes]]๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณดํ†ต ๋ฐฐ์—ด๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค. fooํ•จ์ˆ˜์˜ [[Scopes]]๋Š” [1]์ „์—ญ ์ฝ”๋“œ๋กœ ์ง„์ž… ์‹œ ๊ฒฐ์ •๋˜์—ˆ์œผ๋ฉฐ, ๊ทธ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

foo.[[Scopes]] = [ globalContext.VO ]

  1. ์ด ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜ ๊ฐ์ฒด์ธ AO๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

  2. ํ•จ์ˆ˜ foo์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ๋จผ์ € ์ž์‹ ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์ธ foo์˜ Activation Object(AO)๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

  3. AO๋Š” arguments ํ”„๋กœํผํ‹ฐ์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  4. fooํ•จ์ˆ˜์˜ [[Scopes]]๊ฐ€ ์Šค์ฝ”ํ”„ ์ฒด์ธ์— push๋œ๋‹ค. ์ฆ‰, foo์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ AO์™€ GO๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋‹ด์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

    fooContext.Scope = fooContext.AO + foo.[[Scopes]]

    fooContext.Scope = [ fooContext.AO, globalContext.VO ]

2-2-2. ๋ณ€์ˆ˜ ๊ฐ์ฒดํ™” (Variable Instantiation) ์‹คํ–‰

Function Code๋Š” AO์— ๋Œ€ํ•ด ๋ณ€์ˆ˜ ๊ฐ์ฒดํ™”๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 1. bar ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ - bar ํ•จ์ˆ˜ ์ƒ์„ฑ

  • AO์— ํ•จ์ˆ˜ ์ด๋ฆ„ bar๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ, bar์˜ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๊ฐ’์œผ๋กœ ํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • bar ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์ธ [[Scopes]] ํ”„๋กœํผํ‹ฐ๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

bar.[[Scope]] = [ fooContext.AO, globalContext.VO ]

  1. ๋ณ€์ˆ˜ y ์ฒ˜๋ฆฌ - ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

๋ณ€์ˆ˜๋ช… y๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ, undefined๋ฅผ ๊ฐ’์œผ๋กœ ํ•˜์—ฌ AO์— ์ถ”๊ฐ€ํ•œ๋‹ค.

2-2-3. this value ๊ฒฐ์ •

this์— ํ• ๋‹น๋˜๋Š” ๊ฐ’์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ํŒจํ„ด์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.

  • ๋‚ด๋ถ€ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ, this์˜ ๊ฐ’์€ ์ „์—ญ ๊ฐ์ฒด์ด๋‹ค.

๐Ÿ“Œ 3. foo ํ•จ์ˆ˜ ์ฝ”๋“œ ์‹คํ–‰

var x = 'xxx';

function foo () {
  var y = 'yyy';

  function bar () {
    var z = 'zzz';
    console.log(x + y + z);
  }
  bar();
}

foo();

๋จผ์ € y ๋ณ€์ˆ˜์— 'yyy'๋ฅผ ํ• ๋‹นํ•˜๊ณ , ํ•จ์ˆ˜ bar๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

3-1 ๋ณ€์ˆ˜ ๊ฐ’ ํ• ๋‹น

๋ณ€์ˆ˜ y์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด, ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๋”ฐ๋ผ ๊ฐ€๋ฉฐ VO์— ๋ณ€์ˆ˜๋ช… y๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค. y๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ 'yyy'๋กœ ํ• ๋‹นํ•œ๋‹ค.

3-2 ํ•จ์ˆ˜ bar ํ˜ธ์ถœ

ํ•จ์ˆ˜ bar๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, bar์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์— ํ‘ธ์‰ฌ๋œ๋‹ค. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ 1. ์Šค์ฝ”ํ”„ ์ฒด์ธ์˜ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™” 2. ๋ณ€์ˆ˜ ๊ฐ์ฒดํ™” ์‹คํ–‰ 3. this ๊ฒฐ์ •์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์„ฑ์‹œ, bar์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ bar์˜ VO์ธ AO-2๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ ํ›„ bar์˜ [[Scopes]]๋ฅผ ์Šค์ฝ”ํ”„ ์ฒด์ธ์— pushํ•œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ bar ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ๊ตฌ์„ฑ๋œ๋‹ค.

barContext.Scope = [ barContext.AO fooContext.AO, globalContext.VO ]

๐Ÿ“Œ 4. bar ํ•จ์ˆ˜ ์ฝ”๋“œ ์‹คํ–‰

console.log(x + y + z);์˜ ๊ฒฐ๊ณผ๋Š” xxxyyyzzz์ธ๋ฐ, bar ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์—์„œ ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

barContext.Scope = [ barContext.AO - z : 'zzz' fooContext.AO, - y : 'yyy' globalContext.VO - x : 'xxx' ]

๐Ÿ“Œ ์ •๋ฆฌ

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ์ƒ์„ฑ๋˜๋ฉฐ, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์— ํ‘ธ์‰ฌ๋œ๋‹ค.

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ์‹œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์„ธ ๊ฐ€์ง€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.

    1. ์Šค์ฝ”ํ”„์ฒด์ธ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”
      • ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ์˜ ๊ฒฝ์šฐ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ Scope = AO + [[Scopes]]์ด๋‹ค.
    2. ๋ณ€์ˆ˜ ๊ฐ์ฒดํ™”
      1. ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ธ์ˆ˜ ์ •๋ณด ์ถ”๊ฐ€
      2. ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…
        • property : ํ•จ์ˆ˜ ์ด๋ฆ„
        • value : ํ•จ์ˆ˜ ๊ฐ์ฒด
      3. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…
        • property : ๋ณ€์ˆ˜๋ช…
        • value : undefined
    3. this value ๊ฒฐ์ •
  • ํ•จ์ˆ˜์˜ [[Scopes]] ๊ฒฐ์ •

    • ํ•จ์ˆ˜ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ๊ฒฐ์ •๋œ๋‹ค.
    • ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ฐธ์กฐ