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

[ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ] ์Šค์ฝ”ํ”„ ์ฒด์ธ(Scope chain)์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž

by YWTechIT 2021. 11. 15.
728x90

๐Ÿ“ ์Šค์ฝ”ํ”„ ์ฒด์ธ(scope chain)์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

scope๋Š” ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์–ด๋–ค ๊ฒฝ๊ณ„ A์˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” A์˜ ์™ธ๋ถ€๋ฟ ์•„๋‹ˆ๋ผ A์˜ ๋‚ด๋ถ€์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, A์˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์˜ค์ง A์˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์˜๋ฅผ ์•ˆ์—์„œ๋ถ€ํ„ฐ ๋ฐ”๊นฅ์œผ๋กœ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ด๋•Œ outerEnvironmentReference๋Š” ํ˜„์žฌ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ L.E๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ๋˜๋Š”๋ฐ, ์ค‘์š”ํ•œ ์ ์€ ๊ณผ๊ฑฐ ๋‹น์‹œ ์„ ์–ธ๋œ ์‹œ์ ์ด๋‹ค.

 

๋‹ค์Œ ์ฝ”๋“œ์˜ foo()์™€ bar()์˜ ์ถœ๋ ฅ๊ฐ’์€ 1๋กœ ๋™์ผํ•œ๋ฐ, ๊ทธ ์ด์œ ๋Š” function bar๊ฐ€ ์„ ์–ธ๋œ ์‹œ์ ์˜ x๋Š” ์ „์—ญ ๋ณ€์ˆ˜์ธ x๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋œ๋‹ค. ์ฆ‰, this์ฒ˜๋Ÿผ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ํ˜ธ์ถœํ–ˆ๋Š”์ง€ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์—์„œ ์ •์˜ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์œ„์น˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„ ๊ฒฐ์ •์— ์–ด๋– ํ•œ ์˜ํ–ฅ๋„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์–ธ์ œ๋‚˜ ์ž์‹ ์ด ์ •์˜๋œ ์Šค์ฝ”ํ”„๋‹ค. ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์œผ๋กœ ์ •์˜๋œ bar ํ•จ์ˆ˜๋Š” ์ „์—ญ์—์„œ ์ •์˜๋œ ํ•จ์ˆ˜๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ „์—ญ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋จผ์ € ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋•Œ ์ƒ์„ฑ๋œ bar ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  bar ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ˜ธ์ถœ๋œ ๊ณณ์ด ์–ด๋””์ธ์ง€ ๊ด€๊ณ„์—†์ด ์–ธ์ œ๋‚˜ ์ž์‹ ์ด ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

var x = 1;

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

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

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

reference

  1. ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  2. ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€