TIL.13 - Js(Scope)

quokkaΒ·2021λ…„ 10μ›” 11일
0

javascriptΒ 

λͺ©λ‘ 보기
13/13
post-thumbnail

🌈 Scope

πŸ’Ž Scope의 κ°œλ…
🀜 Javascriptμ—μ„œ Scopeλž€ 'λ³€μˆ˜κ°€ μ–΄λ””κΉŒμ§€ 쓰일 수 μžˆλŠ”μ§€μ— λŒ€ν•œ λ²”μœ„'λ₯Ό μ˜λ―Έν•œλ‹€.
🀜 μ–΄λ–€ λ³€μˆ˜λŠ” μ—¬κΈ°μ €κΈ°μ„œ μ“Έ 수 μžˆλŠ” λ°˜λ©΄μ—, 또 μ–΄λ–€ λ³€μˆ˜λŠ” νŠΉμ • ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ μ“Έ 수 μžˆλ‹€.
✏️ 이런 κ°œλ…μ΄ λ°”λ‘œ Scope이닀.

🌈 Block

✏️ block은 μ€‘κ΄„ν˜Έ {} 둜 감싸진 것을 λ§ν•œλ‹€.
πŸ’Ž block의 μ’…λ₯˜
πŸ‘‰ function λ‚΄λΆ€λŠ” ν•˜λ‚˜μ˜ block이닀.

function hi() {
  return 'i am block';
};

πŸ‘‰ forλ¬Έ

for (let i = 0; i < 10; i++) {
  count++;
};

πŸ‘‰ ifλ¬Έ

if (i === 1) {
  let j = 'one';
  console.log(j);
};

✏️ {}(block) λ‚΄λΆ€μ—μ„œ λ³€μˆ˜κ°€ μ •μ˜λ˜λ©΄ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ {}(block) λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. {}(block) λ‚΄λΆ€μ—μ„œ μ •μ˜λœ λ³€μˆ˜λŠ” πŸ”₯local Variable(지역 λ³€μˆ˜) 라고 λΆ€λ₯Έλ‹€. πŸ‘‡

function getResult() {
  let result = 10;  
  return result;
};
// μžλ°”μŠ€ν¬λ¦½νŠΈ μ—λŸ¬! 
// getResult λ‚΄λΆ€μ˜ scope에 μ ‘κ·Όν•  수 μ—†λ‹€
console.log(result);

πŸ‘‰ console.log(result)μ—μ„œ getResult 내뢀에 접근이 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— resultλΌλŠ” λ³€μˆ˜κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ μ•Œμ§€ λͺ»ν•œλ‹€.
πŸ‘‰ resultλΌλŠ” λ³€μˆ˜λŠ” getResult ν•¨μˆ˜μ˜ {}(block)μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

πŸ’Ž Global(μ „μ—­) 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'λ₯Ό λ°˜ν™˜ν•œ 것이닀.

πŸ’Ž Scope의 μ˜€μ—Ό

🀜 global λ³€μˆ˜λ₯Ό μ“°λ©΄ μ—¬κΈ° μ €κΈ°μ„œ μ ‘κ·Όν•˜κΈ° μ‰¬μ›Œμ„œ μ’‹λ‹€κ³  생각할 수 μžˆμ§€λ§Œ, λ„ˆλ¬΄ λ‚¨μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ— 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€.
🀜 global λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄, ν•΄λ‹Ήν”„λ‘œκ·Έλž¨μ˜ μ–΄λ””μ—μ„œλ‚˜ μ‚¬μš©ν•  수 μžˆλŠ”Β global namespaceλ₯Ό κ°–λŠ”λ‹€.
🀜 namespaceλΌλŠ” 것은 λ³€μˆ˜ 이름을 μ‚¬μš©ν•  수 μžˆλŠ” λ²”μœ„λΌλŠ” λœ»μ΄λ‹€. scope이라고도 ν•˜κ³  특히 λ³€μˆ˜μ΄λ¦„μ„ μ–˜κΈ°ν•  λ•ŒλŠ” namespace라고도 ν•œλ‹€.
global λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ λ•ŒκΉŒμ§€ 계속 μ‚΄μ•„μžˆλ‹€.
🀜 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" 으둜 μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

πŸ’Ž 쒋은 Scoping μŠ΅κ΄€
✏️ global λ³€μˆ˜κ°€ μ—¬κΈ°μ €κΈ°μ„œ μˆ˜μ •λ˜λ©΄ μ•ˆλ˜κΈ° λ•Œλ¬Έμ— λ³€μˆ˜λ“€μ€ block scope으둜 μ΅œλŒ€ν•œ λ‚˜λˆ λ†”μ•Ό ν•œλ‹€.

  1. νƒ€μ΄νŠΈν•œ scope(tightly scoping)의 λ³€μˆ˜λŠ” μ½”λ“œ ν’ˆμ§ˆμ„ μ˜¬λ €μ€λ‹ˆλ‹€!
  2. μ½”λ“œκ°€ block 으둜 λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„λ˜κΈ° λ•Œλ¬Έμ— μ½”λ“œ 가독성이 μ˜¬λΌκ°‘λ‹ˆλ‹€.
  3. μ½”λ“œκ°€ ν•œμ€„ ν•œμ€„ μ­‰ λ‚˜μ—΄λœ 것이 μ•„λ‹ˆλΌ 각각의 κΈ°λŠ₯λ³„λ‘œ block을 λ‚˜λˆ„λ©΄ μ½”λ“œκ°€ μ΄ν•΄ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
  4. λ‚˜μ€‘μ— μ½”λ“œλ₯Ό μˆ˜μ •ν•  일이 μžˆμ„ λ•Œ, μ½”λ“œλ₯Ό μ˜€λžœλ§Œμ— 보더라도 잘 λ‚˜λ‰˜μ–΄ μžˆμ–΄μ„œ μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
  5. ν”„λ‘œκ·Έλž¨μ΄ λλ‚ λ•ŒκΉŒμ§€ λ³€μˆ˜κ°€ μ‚΄μ•„μžˆλŠ” 것이 μ•„λ‹ˆλΌμ„œ(block이 λλ‚˜λ©΄ local λ³€μˆ˜μ˜ 삢이 λλ‚˜μ„œ) λ©”λͺ¨λ¦¬ μ ˆμ•½λ„ λ©λ‹ˆλ‹€.

πŸ”₯ global λ³€μˆ˜λŠ” 쓰지 μ•Šλ„λ‘ λ…Έλ ₯ν•΄μ•Όν•˜λ©°
πŸ”₯ μ΅œλŒ€ν•œ {} λ‚΄μ—μ„œ λ³€μˆ˜λ₯Ό μƒˆλ‘œ λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•˜λŠ”κ²Œ μ’‹λ‹€.
πŸ”₯ 항상 blockλ§ˆλ‹€ λ‹€λ₯Έ μ΄λ¦„μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μž.

profile
πŸ‘©πŸ»β€πŸ’» 맀일맀일이 κΈ°λŒ€λ˜λŠ” 개발자 ^^

0개의 λŒ“κΈ€