SCOPE

์Šค์ฝ”ํ”„๋Š” ์ฐธ์กฐ ๋Œ€์ƒ ์‹๋ณ„์ž(identifier, ๋ณ€์ˆ˜, ํ•จ์ˆ˜์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์ด ์–ด๋–ค ๋Œ€์ƒ์„ ๋‹ค๋ฅธ ๋Œ€์ƒ๊ณผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ด๋ฆ„)๋ฅผ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•œ ๊ทœ์น™์ด๋‹ค. ์‹๋ณ„์ž๋Š” ์ž์‹ ์ด ์–ด๋””์—์„œ ์„ ์–ธ๋๋Š”์ง€์— ์˜ํ•ด ์ž์‹ ์ด ์œ ํšจํ•œ ๋ฒ”์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค.

var x = 'global';

function foo(){
  var x = 'function scope';
  console.log(x);
}
foo(); // 'function scope'
console.log(x); // global

์ด๋ฆ„์ด ๊ฐ™์€ ๋ณ€์ˆ˜ x๊ฐ€ ์ค‘๋ณต ์„ ์–ธ๋˜์–ด์žˆ๋Š” ์˜ˆ์‹œ์ด๋‹ค. ์ „์—ญ์œผ๋กœ ์„ ์–ธ๋œ x๋Š” ์–ด๋””์—์„œ๋“  ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ foo ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ x๋Š” ๋‚ด๋ถ€์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ์Šค์ฝ”ํ”„๋ผ๊ณ  ํ•œ๋‹ค. ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค.

  • ์ „์—ญ ์Šค์ฝ”ํ”„ ( Global Scope ) : ์ฝ”๋“œ ์–ด๋””์—์„œ๋“ ์ง€ ์ฐธ์กฐ ๊ฐ€๋Šฅ

  • ์ง€์—ญ ์Šค์ฝ”ํ”„ ( Local Scope or Function-Level Scope) : ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ธ”๋ก์ด ๋งŒ๋“  ์Šค์ฝ”ํ”„๋กœ ํ•จ์ˆ˜ ์ž์‹ ๊ณผ ํ•˜์œ„ ํ•จ์ˆ˜์—์„œ๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ

ํƒ€ ์–ธ์–ด๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ ( block-level scope )๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„( function-level scope ) ๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ž€ ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ธ”๋ก๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ, ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋Š” ์œ ํšจํ•˜์ง€ ์•Š๋‹ค.

๋‹จ, ECMAScript 6์—์„œ ๋„์ž…๋œ let ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

var x = 0;
{
  var x = 1;
  console.log(x); // 1
}
console.log(x);   // 1

let y = 0;
{
  let y = 1;
  console.log(y); // 1
}
console.log(y);   // 0

์ „์—ญ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๊ฐ์ฒด(Global Object)์ธ window ์˜ ํ”„๋กœํผํ‹ฐ์ด๋‹ค.

var x = 'global';

function foo(){
  var x = 'function scope';
  console.log(x);
}
console.log(window.x);  // 'global';

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

Lexical Scope

lexical scope๋Š” ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ํ˜ธ์ถœํ•˜๋Š”์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋””์— ์„ ์–ธํ•˜์˜€๋Š”์ง€์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” lexical scope๋ฅผ ๋”ฐ๋ฅด๋ฏ€๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ ์‹œ์ ์— ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค.

var x = 1;

function foo() {
  var x = 10;
  bar();
}

function bar() {
  console.log(x);
}

foo(); // 1
bar(); // 1

lexical scope๋ฅผ ๋”ฐ๋ฅด๋ฏ€๋กœ, foo(), bar() ํ˜ธ์ถœ์‹œ 1์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ตœ์†Œํ•œ์˜ ์ „์—ญ๋ณ€์ˆ˜ ์‚ฌ์šฉ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ณ€์ˆ˜๋ช…์˜ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ, ์ „์—ญ๋ณ€์ˆ˜์˜ ๋ฌด๋ถ„๋ณ„ํ•œ ์‚ฌ์šฉ์€ ๋ฌด์ฒ™ ์œ„ํ—˜ํ•˜๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด, ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„์ธ ์Šค์ฝ”ํ”„๋Š” ์ข์„์ˆ˜๋ก ์ข‹๋‹ค.

var MYAPP = {};
MYAPP.student = {
  name: 'Faker',
  gender: 'male'
};

์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์ „์—ญ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜(IIFE, Immediately-Invoked Function Expression)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์ „์—ญ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ์–ต์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

(function () {
  var MYAPP = {};

   MYAPP.student = {
    name: 'Faker',
    gender: 'male'
  };

  console.log(MYAPP.student.name); // Faker
}());

console.log(MYAPP.student.name);
VM1857:12 Uncaught ReferenceError: MYAPP is not defined
    at <anonymous>:12:13

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋˜๊ณ  ๊ทธ ํ›„ ๋ฐ”๋กœ ์‚ฌ๋ผ์ง„๋‹ค.

์ฐธ์กฐ ํŽ˜์ด์ง€

Last updated