scope

๋ณ€์ˆ˜๊ฐ€ ์œ ํšจํ•œ ๋ฒ”์œ„

  • ์ฝ”๋“œ ๋ธ”๋Ÿญ {}์•ˆ์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก์•ˆ์—์„œ๋งŒ ์œ ํšจ

๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ

๋‚ด๋ถ€ ์ˆจ๊น€ ์—ฐ๊ด€ ๊ฐ์ฒด ( ์‹คํ–‰์ค‘์ธ ํ•จ์ˆ˜, ์ฝ”๋“œ๋ธ”๋Ÿญ, ์Šคํฌ๋ฆฝํŠธ ์ „์ฒด๋Š” ์ด๋ฅผ ๊ฐ–๋Š”๋‹ค.)

๋ช…์„ธ์„œ์—๋งŒ ์กด์ œํ•˜๋Š” js๋™์ž‘ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ์ด๋ก ์ƒ์˜ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์กฐ์ž‘์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ตฌ์„ฑ

  • ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ : ๋ชจ๋“  ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด. this์™€ ๊ฐ™์€ ๊ธฐํƒ€ ์ •๋ณด๋„ ํฌํ•จ

  • ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ : ์™ธ๋ถ€ ์ฝ”๋“œ์™€ ์—ฐ๊ด€

๋ณ€์ˆ˜ ์„ ์–ธ์‹œ ๋™์ž‘ ๊ณผ์ •

๋ณ€์ˆ˜๋Š” ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ(ํŠน์ˆ˜ ๋‚ด๋ถ€ ๊ฐ์ฒด)์˜ ํ”„๋กœํผํ‹ฐ

์ „์—ญ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ : ์Šคํฌ๋ฆฝํŠธ ์ „์ฒด์™€ ๊ด€๋ จ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ. ์ „์—ญ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค. (null)

let user;
user = 'hello';
user = 'bye';
  1. ์ฒซ ๋ณ€์ˆ˜ ์„ ์–ธ์‹œ uninitialized์ƒํƒœ = ํŠน์ˆ˜ ๋‚ด๋ถ€ ์ƒํƒœ๋กœ js์—”์ง„์€ ์ด ๋ณ€์ˆ˜๋ฅผ ์ธ์ง€ํ•˜์ง€๋งŒ ์ ‘๊ทผ,์ฐธ์กฐ๋ฅผ ํ• ์ˆ˜ ์—†๋Š” ์ƒํƒœ

  2. let user๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ ๊ฐ’์€ undefined๋กœ ๋ฐ”๋€Œ์–ด ์ด๋•Œ๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  3. user์˜ ๊ฐ’์ด hello๋กœ ๋ฐ”๋€๋‹ค.

  4. user์˜ ๊ฐ’์ด bye๋กœ ๋ฐ”๋€๋‹ค.

ํ•จ์ˆ˜ ์„ ์–ธ์‹œ ๋™์ž‘ ๊ณผ์ •

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

function sayHi() {
  alert('hello');
}

๋ธ”๋Ÿญ ์ฝ”๋“œ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ์ƒˆ๋กœ์šด ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด ์ž๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ ์ด ํ™˜๊ฒฝ์€ ๋‚ด๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๊ณ  ์ฝ”๋“œ๋ธ”๋Ÿญ ๋ฐ–์˜ ํ™˜๊ฒฝ์€ ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์œผ๋กœ ๋‚ด๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

๊ทธ๋ž˜์„œ, ์ฝ”๋“œ๋ธ”๋Ÿญ ๋‚ด๋ถ€์—์„œ ํŠน์ • ๋ณ€์ˆ˜์— ์ ‘๊ทผํ• ๋•Œ ์ฒ˜์Œ์— ๋‚ด๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ์ ‘๊ทผํ›„ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ฐธ์กฐ๋ฅผ ์ด์šฉํ•ด ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ฐพ๊ฒŒ ๋œ๋‹ค.

๋ชจ๋“  ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋œ ๊ณณ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ๊ธฐ์–ตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ํ•จ์ˆ˜๋Š” [[Environment]]๋ผ ๋ถˆ๋ฆฌ๋Š” ์ˆจ๊น€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๊ณ  ์ด๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ณณ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค.

ํด๋กœ์ €

์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์ด ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋กœ ์Šค์ฝ”ํ”„์— ๋ฌถ์ธ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ .

new Function()์„ ์ œ์™ธํ•˜๊ณ ๋Š” js์˜ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ํด๋กœ์ €์ด๋‹ค.

์œ„์˜ ์„ค๋ช…๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜ ์ƒ์„ฑ์‹œ ์ž๋™์œผ๋กœ [[Environment]]๋ผ๋Š” ์ˆจ๊น€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์—์„œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ์ •๋ฆฌํ–ˆ๋Š”๋ฐ ์ค‘์ฒฉํ•จ์ˆ˜ ์—์„œ๋„ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ ์‹œ์ผœ ์ฃผ๋Š” ๊ฒƒ์ด [[Environment]]์— ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋๋‚˜๋„ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋˜๋Š” ์ด์œ ์ด๋‹ค.

function f() {
  let value = 123;

  return function () {
    alert(value);
  };
}

let g = f(); // g.[[Environment]]์— f() ํ˜ธ์ถœ ์‹œ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ ์ •๋ณด๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ V8์—”์ง„ ๋™์ž‘

์œ„์˜ ๋‚ด์šฉ์€ ๋ช…์„ธ์„œ์— ๋‚˜์˜จ ๊ธฐ๋ณธ ์ •์˜์ด์ง€ js์—”์ง„์„ ์ตœ์ ํ™” ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋™์ž‘ ๋ฐฉ์‹์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ V8์—”์ง„์€ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ์•ˆํ•  ๊ฒƒ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ •๋ฆฌํ•ด๋ฒ„๋ฆฐ๋‹ค.

function f() {
  let value = 123;

  return function () {
    alert(value);
  };
}

let g = f(); // Uncaught ReferenceError: value is not defined๊ฐ€ ์ถœ๋ ฅ

Last updated