πŸš§μŠ€μ½”ν”„

JSμ—μ„œ μƒμ„±λœ 'λ³€μˆ˜' λ˜λŠ” 'ν•¨μˆ˜'λŠ” λͺ¨λ‘ 유효 λ²”μœ„λ₯Ό κ°–κ²Œλ¨

유효 λ²”μœ„β“
πŸ‘‰ λ³€μˆ˜ & ν•¨μˆ˜κ°€ 영ν–₯을 λ―ΈμΉ˜λŠ” λ²”μœ„, μ˜μ–΄λ‘  'μŠ€μ½”ν”„'

🀩 μŠ€μ½”ν”„λŠ” JS 뿐만 μ•„λ‹ˆλΌ λͺ¨λ“  ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ€‘μš”ν•œ κ°œλ…
βœ… JS둜 ν”„λ‘œκ·Έλž˜λ° ν•˜κΈ° μœ„ν•΄μ„  μŠ€μ½”ν”„μ— λŒ€ν•œ κ°œλ… ν™•μ‹€νžˆ μ΄ν•΄ν•˜κ³  μžˆμ–΄μ•Ό 함


πŸ±β€πŸ’»μ—¬λŸ¬ 개의 μŠ€μ½”ν”„κ°€ μžˆλŠ”λ° ν•˜λ‚˜μ”© μ•Œμ•„λ³΄μžβš‘

πŸ’‘μŠ€μ½”ν”„λŠ” 크게 'μ „μ—­' & 'μ§€μ—­'으둜 λΆ„λ₯˜

πŸ“Œμ „μ—­ μŠ€μ½”ν”„

let globalNum = 100;

function testFunc() {
  console.log(globalNum);
}

testFunc();  // 100
console.log(globalNum);  // 100

좜λ ₯ κ²°κ³Ό μ‚΄νŽ΄λ³΄λ©΄ μ½˜μ†” 탭에 숫자 100이 2번 좜λ ₯된 κ±Έ λ³Ό 수 μžˆμŒπŸ‘€

μ „μ—­ 곡간에 μ„ μ–Έν•œ globalNum λ³€μˆ˜λŠ” μ „μ—­ μŠ€μ½”ν”„λ₯Ό κ°–μŒβœ”
μ „μ—­ κ³΅κ°„μ—μ„œλ“  이 testfunk ν•¨μˆ˜μ˜ λ‚΄λΆ€μ—μ„œλ“  globalNum λ³€μˆ˜μ— 항상 μ ‘κ·ΌπŸ™†β€β™€οΈ

전역에 μ„ μ–Έλœ λ³€μˆ˜βž‘μ–΄λ””μ—μ„œλ‚˜ μ ‘κ·Ό κ°€λŠ₯ν•œ 'μ „μ—­ μŠ€μ½”ν”„' κ°–κΈ° λ•Œλ¬Έμ—
πŸ‘‰ 'μ „μ—­ λ³€μˆ˜' ν˜Ήμ€ 'μ™ΈλΆ€ λ³€μˆ˜' 라고 뢀름

πŸ“Œμ§€μ—­ μŠ€μ½”ν”„

πŸ’₯둜컬 μŠ€μ½”ν”„, 'νŠΉμ • μ§€μ—­'μ—μ„œλ§Œ μ ‘κ·Ό ν•  수 μžˆλŠ” λ²”μœ„

let globalNum = 100;

function testFunc() {
  let innerNum = 50;
  console.log(globalNum);  // 100
  console.log(innerNum);  // 50
}

testFunc();  // 100 50
console.log(globalNum);  // 100
console.log(innerNum);  // μ—λŸ¬

이전관 λ‹€λ₯΄κ²Œ μ—λŸ¬ λ°œμƒν•˜λŠ” κ±Έ λ³Ό 수 있음
🚨innerNum λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ§€ μ•Šμ•˜λ‹€λŠ” 였λ₯˜ λ°œμƒπŸš¨

β—λ°œμƒ 이유 : innerNumλŠ” 전역이 μ•„λ‹Œ testfunk ν•¨μˆ˜μ˜ 내뢀에
νŠΉμ • μ§€μ—­μ—μ„œ μ„ μ–Έλœ ν•¨μˆ˜μ΄κΈ°μ— 'μ§€μ—­ μŠ€μ½”ν”„'λ₯Ό κ°–λŠ” λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έ

innerNum은 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯β­•

μ΄λ ‡κ²Œ λ°”κΉ₯μ—μ„œ μ‹λ³„μžμ—κ²Œ μ ‘κ·Όν•˜λ € ν•œλ‹€λ©΄ 였λ₯˜ λ°œμƒπŸš¨

βœ…νŠΉμ • μ§€μ—­μ—μ„œλ§Œ μœ νš¨ν•œ λ²”μœ„λ₯Ό κ°–λŠ” λ³€μˆ˜βž‘'μ§€μ—­ λ³€μˆ˜'βœ…

πŸ‘‡μ΄λ²ˆμ—” μ½”λ“œμ˜ 흐름을 같이 봐보자🧐

let global = 'λ‚˜λŠ” μ „μ—­ λ³€μˆ˜μž…λ‹ˆλ‹€';

function outerFunction() {
  let outer = 'λ‚˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜μž…λ‹ˆλ‹€';

  function innerFunction() {
    let inner = 'λ‚˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜μž…λ‹ˆλ‹€';
    console.log(global);  // βœ… 'λ‚˜λŠ” μ „μ—­ λ³€μˆ˜μž…λ‹ˆλ‹€'
    console.log(outer);   // βœ… ν΄λ‘œμ €λ‘œ μ ‘κ·Ό β†’ 'λ‚˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜μž…λ‹ˆλ‹€'
    console.log(inner);   // βœ… 'λ‚˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜μž…λ‹ˆλ‹€'
  }

  innerFunction();         // βœ… μœ„μ˜ 3개 μ½˜μ†” μ‹€ν–‰
  console.log(global);     // βœ… 'λ‚˜λŠ” μ „μ—­ λ³€μˆ˜μž…λ‹ˆλ‹€'
  console.log(outer);      // βœ… 'λ‚˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜μž…λ‹ˆλ‹€'
  console.log(inner);      // ❌ ReferenceError: inner is not defined
}

outerFunction();

πŸ”₯ 핡심 포인트 μš”μ•½

  • μ „μ—­ λ³€μˆ˜ globalβž‘μ–΄λ””μ„œλ“  μ ‘κ·Ό κ°€λŠ₯β­•
  • outer➑outerFunction μ•ˆμ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯β­•
  • inner➑innerFunction μ•ˆμ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯β­•
    🚨outerFunctionμ—μ„œ console.log(inner) ν•˜λ©΄ μ—λŸ¬λ‚œ κ²ƒπŸš¨

πŸ”»μ§€μ—­ μŠ€μ½”ν”„ - ν•¨μˆ˜ & 블둝 μŠ€μ½”ν”„

function print() {
  // νŠΉμ • μ½”λ“œλ₯Ό 반볡적으둜 μ‹€ν–‰ν•  수 μžˆλŠ” 반볡문
  // (μ΄ˆκΈ°ν™”μ‹ 쑰건식 증감식)
  for(let i=0; i<10; i++) {
  	// μ½”λ“œλ₯Ό ν•΄λ‹Ή 쑰건식에 λ§Œμ‘±ν•  λ•ŒκΉŒμ§€ 반볡적으둜 μˆ˜ν–‰
    console.log(i);  // 0~9κΉŒμ§€
  }
  console.log(i);  // 였λ₯˜ λ°œμƒ
}

print();  // ν•¨μˆ˜ 호좜

μ½”λ“œ μ‹€ν–‰ν•˜λ©΄ 0~9κΉŒμ§€ 값이 μˆœμ„œλŒ€λ‘œ 좜λ ₯λ˜μ§€λ§Œ
λ§ˆμ§€λ§‰μ— 였λ₯˜κ°€ λ°œμƒν•œ κ±Έ λ³Ό 수 μžˆμ„κ±°μž„πŸ‘€
🚨print ν•¨μˆ˜μ— iκ°€ μ •μ˜λ˜μ§€ μ•Šμ•„μ„œ 였λ₯˜ λ°œμƒπŸš¨

🧱let μ΄λΌλŠ” ν‚€μ›Œλ“œλ‘œ μž‘μ„±λœ λ³€μˆ˜
πŸ‘‰ { 블둝 λ‹¨μœ„μ—μ„œλ§Œ μœ νš¨ν•œ '블둝 μŠ€μ½”ν”„'λ₯Ό κ°–κΈ° λ•Œλ¬Έ } πŸ€“

이전 μ½”λ“œμ—μ„œ let➑var둜 μˆ˜μ •ν•˜λ©΄
λ³€μˆ˜ iλ₯Ό 'ν•¨μˆ˜ μŠ€μ½”ν”„'λ₯Ό κ°–λŠ” λ³€μˆ˜λ‘œ λ§Œλ“€ 수 있음✨

μ½”λ“œ 싀행해보면 μ΄λ²ˆμ—” 였λ₯˜ λ°œμƒν•˜μ§€ μ•Šκ³ 
숫자 0~10κΉŒμ§€ μ „λΆ€ 좜λ ₯λ˜λŠ” 것을 λ³Ό 수 μžˆμŒβ—

πŸ’β€β™€οΈ let & var

이 λ‘˜μ˜ 차이점은 let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” '블둝 μŠ€μ½”ν”„',
var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 'ν•¨μˆ˜ μŠ€μ½”ν”„'λ₯Ό κ°–μŒ

❌let μž¬ν• λ‹Ή λΆˆκ°€βŒ

β­•var μž¬ν• λ‹Ή κ°€λŠ₯β­•
πŸ‘‰ 같은 μ΄λ¦„μ˜ λ³€μˆ˜ μ—¬λŸ¬ 번 μž¬μ„ μ–Έ κ°€λŠ₯
기쑴에 μ„ μ–Έλœ λ³€μˆ˜λŠ” λ¬΄μ‹œλ˜λŠ” 것을 λ³Ό 수 있음

JS 초기 버전에 λ„μž…λœ λ³€μˆ˜ μ„ μ–Έ λ°©μ‹μœΌλ‘œ
였래된 λ³€μˆ˜ μ„ μ–Έ ν‚€μ›Œλ“œ( 잘 μ‚¬μš©ν•˜μ§€ μ•ŠμŒβœ” )

'ν•¨μˆ˜ μŠ€μ½”ν”„', ν•¨μˆ˜ λ‚΄λΆ€ μ–΄λ””μ„œλ“  μ ‘κ·Ό κ°€λŠ₯
βŒν•¨μˆ˜ 외뢀에선 μ ‘κ·Ό λΆˆκ°€βŒ

β—½ let & const
πŸ‘‰ JS ES6 버전에 λ„μž…λœ μ„ μ–Έ 방식
🧱 '블둝 μŠ€μ½”ν”„' μ§€μ›ν•˜λ©° { μ½”λ“œ 블둝 }의 λ‚΄λΆ€μ—μ„œλ§Œ 유효

🧱'블둝 μŠ€μ½”ν”„'βž‘λΈ”λ‘ λ‚΄λΆ€μ—μ„œ 같은 μ΄λ¦„μ˜ λ³€μˆ˜ μž¬μ„ μ–Έ μ‹œ μ—λŸ¬ λ°œμƒπŸš¨
πŸ†™ μ½”λ“œμ˜ μ‹ λ’°μ„± & 예츑 κ°€λŠ₯μ„± λ†’μΈλ‹€λŠ” νŠΉμ§• ‴

var둜 μ„ μ–Έλœ λ³€μˆ˜κ°€ let 으둜 μ„ μ–Έλœ λ³€μˆ˜λ³΄λ‹€ μœ μ—°ν•˜λ‹€κ³  생각할 수 μžˆμ§€λ§Œ
var둜 λ³€μˆ˜ μ„ μ–Έ μ‹œ νŠΉμ • λ³€μˆ˜κ°€ 이미 μ„ μ–Έλ˜μ–΄ μžˆλŠ”μ§€ νŒλ‹¨πŸ™…β€β™€οΈ
μ–΄λ””μ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©λ˜κ³  μžˆλŠ”μ§€ νŒŒμ•… μ–΄λ ΅πŸ₯΄
πŸ’«λ‹¨μ  : ν”„λ‘œκ·Έλž¨ μƒμ˜ 였λ₯˜ λ°œμƒμ‹œν‚¬ 수 μžˆκ²Œλ¨πŸ’«

var : letκ³Ό λ‹€λ₯΄κ²Œ λ³€μˆ˜ μ€‘λ³΅ν•΄μ„œ μ„ μ–Έν•  수 μžˆλŠ” 이유
πŸ‘‰ 'ν•¨μˆ˜ μŠ€μ½”ν”„' κ°€μ§€λ©° 'ν˜Έμ΄μŠ€νŒ…' μ΄λΌλŠ” νŠΉμ„± κ°–κΈ° λ•Œλ¬ΈπŸŽ£

profile
μ•ˆλ…•ν•˜μ„Έμš”! 퍼블리싱 & ν”„λ‘ νŠΈμ—”λ“œ 개발 곡뢀 λΈ”λ‘œκ·Έ μž…λ‹ˆλ‹€!

0개의 λŒ“κΈ€