๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JavaScript/JavaScript

[JavaScript] scope, scope chain

by ์ฝ”๋”ฉํ•˜๋Š” ๋ถ•์–ด 2021. 10. 29.
๋ฐ˜์‘ํ˜•

๐ŸŽˆ ์Šค์ฝ”ํ”„(scope)

์‹๋ณ„์ž์— ๋Œ€ํ•œ ์œ ํšจ๋ฒ”์œ„.

ex) ์–ด๋–ค ๊ฒฝ๊ณ„ A์˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” A์˜ ์™ธ๋ถ€๋ฟ ์•„๋‹ˆ๋ผ A์˜ ๋‚ด๋ถ€์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, A์˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์˜ค์ง A์˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

scope์˜ ๊ฐœ๋…์€ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์— ์กด์žฌํ•œ๋‹ค. ๋‹ค๋งŒ ES5๊นŒ์ง€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํŠน์ดํ•˜๊ฒŒ๋„ ์ „์—ญ๊ณต๊ฐ„์„ ์ œ์™ธํ•˜๋ฉด ์˜ค์ง ํ•จ์ˆ˜์— ์˜ํ•ด์„œ๋งŒ scope๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

 

๐ŸŽˆ ์Šค์ฝ”ํ”„ ์ฒด์ธ(scope chain)

scope๋ฅผ ์•ˆ์—์„œ๋ถ€ํ„ฐ ๋ฐ”๊นฅ์œผ๋กœ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ

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

 

 

์Šค์ฝ”ํ”„ ์ฒด์ธ ์˜ˆ์ œ

var a = 1; var outer = function () { var inner = function () { console.log(a); // undefined var a = 3; } inner(); console.log(a); // 1 }; outer(); console.log(a); // 1

๋˜ํ•œ ์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ผ๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์ƒ์˜ ์‹๋ณ„์ž a๋Š” ์ „์—ญ ๊ณต๊ฐ„์—์„œ๋„ ์„ ์–ธํ–ˆ๊ณ  inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋„ ์„ ์–ธํ–ˆ๋‹ค.
์ฆ‰ inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ a ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ ๊ณต๊ฐ„์—์„œ ์„ ์–ธํ•œ ๋™์ผํ•œ ์ด๋ฆ„์˜ a ๋ณ€์ˆ˜์—๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์…ˆ์ด๋‹ค. ์ด๋ฅผ ๋ณ€์ˆ˜ ์€๋‹‰ํ™”๋ผ๊ณ  ํ•œ๋‹ค.

 

 

 

์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ console.dir์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋””๋ฒ„๊ฑฐ(debugger)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ๋””๋ฒ„๊ฑฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ข€ ๋” ์ œ๋Œ€๋กœ ๋œ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

// console.dir์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
var a = 1;
var outer = function () {
  var b = 2;
  var inner = function () {
    console.log(b);  
    console.dir(inner);
  }
  inner(); 
};
outer();

// debugger์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
var a = 1;
var outer = function () {
  var b = 2;
  var inner = function () {
    console.log(b);  
    debugger();
  }
  inner(); 
};
outer();
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€