TIL_27_with Wecode 017 JavaScript about Scope

JIEUNยท2021๋…„ 2์›” 23์ผ
0
post-thumbnail

๐Ÿฑโ€๐Ÿ‰ Scope
JavaScript์—์„œ scope์ด๋ž€, JavaScript์˜ ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๊ณ  '๋ณ€์ˆ˜๊ฐ€ ์–ด๋””๊นŒ์ง€ ์“ฐ์ผ ์ˆ˜ ์žˆ๋Š”์ง€'์˜ ๋ฒ”์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ณ€์ˆ˜๋Š” ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด์—, ์–ด๋–ค ๋ณ€์ˆ˜๋Š” ํŠน์ • ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์“ธ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฐ ๊ฐœ๋…์ด ๋ฐ”๋กœ scope์ž…๋‹ˆ๋‹ค.
block์ด๋ž€ ์ค‘๊ด„ํ˜ธ({}, curly brace)๋กœ ๊ฐ์‹ธ์ง„ ๊ฒƒ์„ block์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
function์˜ ๋‚ด๋ถ€๋Š” ํ•˜๋‚˜์˜ block์ž…๋‹ˆ๋‹ค.

function hi() {
  return 'i am block'; //{}๋กœ ๊ฐ์‹ธ์ง„ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€!
}

for๋ฌธ๋„ ํ•˜๋‚˜์˜ block์ด๊ณ ์š”

for (let i = 0; i < 10; i++) {
  count++; //{}๊ฐ์‹ธ์ง„ for๋ฌธ์˜ ๋‚ด๋ถ€!
}

if๋ฌธ์˜ {}๋„ ํ•˜๋‚˜์˜ block์ž…๋‹ˆ๋‹ค.

if (i === 1) {
  let j = 'one'; //{}๊ฐ์‹ธ์ง„ if๋ฌธ์˜ ๋‚ด๋ถ€!
  console.log(j);
}

๐Ÿ™€ {}(block)๋‚ด๋ถ€์—์„œ ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜๋ฉด ๋ณ€์ˆ˜๋Š” ์˜ค๋กœ์ง€ {}(block)๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
{}(block)๋‚ด๋ถ€์—์„œ ์ •์˜๋œ ๋ณ€์ˆ˜๋Š” local(์ง€์—ญ)๋ณ€์ˆ˜๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•ด๋ด…์‹œ๋‹น

function getResult() {
  let result = 10;
  return result;
}
// ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—๋Ÿฌ! 
// getResult ๋‚ด๋ถ€์˜ scope์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค
console.log(result);

console.log(result)์—์„œ getResult ๋‚ด๋ถ€์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— result๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
result ๋ผ๋Š” ๋ณ€์ˆ˜๋Š” getResultํ•จ์ˆ˜์˜ {}(block) ๋‚ด๋ถ€์—์„œ ์„ ์–ธ์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, result ๋ณ€์ˆ˜๋Š” getResultํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿฑโ€๐Ÿ‰ Global(์ „์—ญ) Scope
scope์€ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
scope ์™ธ๋ถ€(block๋ฐ–)์—์„œ๋Š” ํŠน์ • scope์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
block๋ฐ–์ธ global scope์—์„œ ๋งŒ๋“  ๋ณ€์ˆ˜๋ฅผ global variable(์ „์—ญ๋ณ€์ˆ˜)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

const color = 'red';
console.log(color);
function returnColor() {
  console.log(color);
  return color;
}
console.log(returnColor());

returnColor ๋ผ๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ, returnColor ํ•จ์ˆ˜ ๋ฐ–์— ์žˆ๋Š” color๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ returnํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
color๋ผ๋Š” ๋ณ€์ˆ˜๋Š” global ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— returnColorํ•จ์ˆ˜์˜ block์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์„œ 'red'๋ฅผ ๋ฐ˜ํ™˜ํ•œ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‹ค์‹œ ๋งํ•˜๋ฉด, color ๋ผ๋Š” ๋ณ€์ˆ˜๋Š” ์ด๋ฏธ returnColor ํ•จ์ˆ˜ ๋ฐ–์—์„œ const color ๋กœ ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •์ด ๋๊ธฐ ๋•Œ๋ฌธ์— returnColor ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿฑโ€๐Ÿ‰ Scope์˜ ์˜ค์—ผ
์œ„์—์„œ ์„ค๋ช…ํ•œ global ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด, ํ•ด๋‹นํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” global namespace๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. namespace ๋ผ๋Š” ๊ฒƒ์€ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค. scope์ด๋ผ๊ณ ๋„ ํ•˜๊ณ  ํŠนํžˆ ๋ณ€์ˆ˜์ด๋ฆ„์„ ์–˜๊ธฐํ•  ๋•Œ๋Š” namespace๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.
global ๋ณ€์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‚ด์•„์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ง์€ local ๋ณ€์ˆ˜๋Š” {} - block์ด ๋๋‚˜๋ฉด ๋” ์ด์ƒ ๋ณ€์ˆ˜๊ฐ€ ์‚ด์•„์žˆ์ง€ ์•Š๊ณ  ์“ธ ์ˆ˜ ์—†๋‹ค๋Š” ๋ง์ž…๋‹ˆ๋‹ค.
global ๋ณ€์ˆ˜๊ฐ€ ๊ณ„์† ์‚ด์•„์žˆ์–ด์„œ ๋ณ€์ˆ˜๊ฐ’์ด ๊ณ„์† ๋ณ€ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ํŠธ๋ž˜ํ‚นํ•˜๊ธฐ๋„ ์–ด๋ ต๊ณ  ์ด ๋ณ€์ˆ˜๋Š” ์–ด๋””์—์„œ ์™œ ํ•„์š”ํ•œ์ง€ ์•Œ๋ ค๋ฉด ๋„๋Œ€์ฒด ์–ด๋””์—์„œ let, const๋กœ ์„ ์–ธ์„ ํ–ˆ๋Š”์ง€ ์ฐพ์•„ ๋‚˜์„œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜๋Š” scope์ด ์˜ค์—ผ๋œ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

const satellite = 'The Moon';
const galaxy = 'The Milky Way';
let stars = 'North Star';
const callMyNightSky = () => {
  stars = 'Sirius';
  return 'Night Sky: ' + satellite + ', ' + stars + ', ' + galaxy;
};
console.log(callMyNightSky());
console.log(stars);
  • stars์ด๋ผ๋Š” global ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • callMyNightSkyํ•จ์ˆ˜์—์„œ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ๊นœ๋นกํ•˜๊ณ  let ํ‚ค์›Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • callMyNightSky์„ ํ˜ธ์ถœํ•˜๋ฉด stars ๋ณ€์ˆ˜์— "Sirius"์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
  • global ๋ณ€์ˆ˜์˜€๋˜ stars์— ์˜ํ–ฅ์ด ๊ฐ”์Šต๋‹ˆ๋‹ค!
  • ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ global ๋ณ€์ˆ˜์ธ stars์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€๋ฐ ๊ฐ’์ด ์ˆ˜์ •๋œ "Sirius"์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    ์•ž์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ๋ช‡ ์‹ญ๊ฐœ ์žˆ์„์ง€๋„ ๋ชจ๋ฅด๋Š” ์ƒํ™ฉ์—์„œ ์ €๋ ‡๊ฒŒ global ๋ณ€์ˆ˜๋ฅผ ๋‚จ์šฉํ•˜๋‹ค๊ฐ€๋Š” ์–ด๋””์„œ ์–ด๋–ป๊ฒŒ ๊ฐ’์ด ์ˆ˜์ •๋ ์ง€ ์•Œ ์ˆ˜ ์—†์–ด์ง‘๋‹ˆ๋‹ค.

๐Ÿฑโ€๐Ÿ‰ ์ข‹์€ Scoping ์Šต๊ด€
์œ„์™€ ๊ฐ™์ด global ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์ˆ˜์ •๋˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜๋“ค์€ block scope์œผ๋กœ ์ตœ๋Œ€ํ•œ ๋‚˜๋ˆ ๋†”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํƒ€์ดํŠธํ•œ ๐Ÿ™€scope(tightly scoping)์˜ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์˜ฌ๋ ค์ค๋‹ˆ๋‹ค!!

  • ์ฝ”๋“œ๊ฐ€ block์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ํ•œ์ค„ํ•œ์ค„ ์ญ‰ ๋‚˜์—ด๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ๋ณ„๋กœ block์„ ๋‚˜๋ˆ„๋ฉด ์ฝ”๋“œ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  • ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ผ์ด ์žˆ์„ ๋•Œ, ์ฝ”๋“œ๋ฅผ ์˜ค๋žœ๋งŒ์— ๋ณด๋”๋ผ๋„ ์ž˜ ๋‚˜๋‰˜์–ด ์žˆ์–ด์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ๋ณ€์ˆ˜๊ฐ€ ์‚ด์•„์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ์„œ(block์ด ๋๋‚˜๋ฉด local ๋ณ€์ˆ˜์˜ ์‚ถ์ด ๋๋‚˜์„œ) ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ๋„ ๋ฉ๋‹ˆ๋‹ค.
    ์ฆ‰, ํ•œ๋งˆ๋””๋กœ ์š”์•ฝํ•˜๋ฉด ๐Ÿ™€global ๋ณ€์ˆ˜๋Š” ์“ฐ์ง€ ์•Š๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ ํ•˜๊ณ , ์ตœ๋Œ€ํ•œ {}๋‚ด์—์„œ let, const์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์“ฐ์ž๋Š” ๋ง์ž…๋‹ˆ๋‹ค.
    ์ด๋ฒˆ์—๋Š” if๋ฌธ์˜ {}์˜ block scope์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
function logSkyColor() {
  const dusk = true;
  let myColor = 'blue'; 
  if (dusk) {
    let myColor = 'pink';
    console.log(myColor); // pink
  }
  console.log(myColor); // blue 
}
console.log(myColor); // ์—๋Ÿฌ!!
  • if๋ฌธ์— {}์˜ ์ฝ”๋“œ block์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— myColor๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ let์œผ๋กœ ์„ ์–ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • if๋ฌธ๋‚ด์—์„œ๋Š” "pink"๋ผ๊ณ  ํ• ๋‹นํ•˜์˜€๊ณ , if๋ฌธ ๋ฐ–์—์„œ๋Š” "blue"๋ผ๊ณ  ํ• ๋‹นํ•œ ๊ฒƒ์— ์ฃผ๋ชฉํ•ด์ฃผ์„ธ์š”.
  • ์‚ฌ์‹ค ์ด ์ฝ”๋“œ๋Š” function์˜ block scope, if๋ฌธ์˜ block scope์œผ๋กœ ๋ชจ๋‘ block ์„ ์ž˜ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ๋„ scope namespace๊ฐ€ ์˜ค์—ผ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๐Ÿ™€์ƒˆ๋กœ์šด block์—์„œ ๋ณ€์ˆ˜๋ฅผ ์“ธ ๋•Œ๋Š” ํ•ญ์ƒ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋ง์•„์ฃผ์„ธ์š”.

JavaScript Switch Statement

0๊ฐœ์˜ ๋Œ“๊ธ€