λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°œλ°œμžκ°€ μ•Œμ•„μ•Ό ν•˜λŠ” 33가지 κ°œλ…

 

GitHub - yjs03057/33-js-concepts: λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°œλ°œμžκ°€ μ•Œμ•„μ•Ό ν•˜λŠ” 33가지 κ°œλ…

λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°œλ°œμžκ°€ μ•Œμ•„μ•Ό ν•˜λŠ” 33가지 κ°œλ…. Contribute to yjs03057/33-js-concepts development by creating an account on GitHub.

github.com

μŠ€μ½”ν”„(유효 λ²”μœ„, Scope)

μŠ€μ½”ν”„λž€, λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜ 이름, ν•¨μˆ˜ 이름, 클래슀 이름 λ“±)λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ³„μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 유효 λ²”μœ„κ°€ κ²°μ •λ©λ‹ˆλ‹€. 즉, μŠ€μ½”ν”„λŠ” μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λ₯Ό λœ»ν•©λ‹ˆλ‹€.

MDN에 λ”°λ₯΄λ©΄ μŠ€μ½”ν”„λž€ ν˜„μž¬ μ‹€ν–‰λ˜λŠ” μ»¨ν…μŠ€νŠΈλ₯Ό λ§ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ»¨ν…μŠ€νŠΈλŠ” κ°’κ³Ό ν‘œν˜„μ‹μ΄ "ν‘œν˜„"λ˜κ±°λ‚˜ 참쑰될 수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. λ§Œμ•½ λ³€μˆ˜ λ˜λŠ” λ‹€λ₯Έ ν‘œν˜„μ‹μ΄ "ν•΄λ‹Ή μŠ€μ½”ν”„"내에 μžˆμ§€ μ•Šλ‹€λ©΄ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μŠ€μ½”ν”„λŠ” λ˜ν•œ 계측적인 ꡬ쑰λ₯Ό 가지기 λ•Œλ¬Έμ— ν•˜μœ„ μŠ€μ½”ν”„λŠ” μƒμœ„ μŠ€μ½”ν”„μ— μ ‘κ·Όν•  수 μžˆμ§€λ§Œ λ°˜λŒ€λŠ” λΆˆκ°€ν•©λ‹ˆλ‹€.

 

<예제 1>

function exampleFunction() {
    var x = "declared inside function";
    // xλŠ” 였직 exampleFunction λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯.
    console.log("Inside function");
    console.log(x);
}

console.log(x);  // μ—λŸ¬ λ°œμƒ

κ·ΈλŸ¬λ‚˜ μ•„λž˜μ™€ 같은 μ½”λ“œλŠ” λ³€μˆ˜κ°€ ν•¨μˆ˜ μ™ΈλΆ€μ˜ μ „μ—­μ—μ„œ μ„ μ–Έλ˜μ—ˆκΈ° λ•Œλ¬Έμ— μœ νš¨ν•©λ‹ˆλ‹€.

 

<예제 2>

var x = "declared outside function";

exampleFunction();

function exampleFunction() {
    console.log("Inside function");
    console.log(x);
}

console.log("Outside function");
console.log(x);

var, ν•¨μˆ˜ μŠ€μ½”ν”„(Function Scope)

var ν‚€μ›Œλ“œλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„(Function Scope)μž…λ‹ˆλ‹€.
μ΄λŠ” μƒμ„±λœ ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•  수 있으며, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μƒμ„±λ˜μ§€ μ•Šμ€ 경우 μ „μ—­ λ²”μœ„λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

function eun() {
  var name = 'goong';
  console.log(name); // 'goong'
}

eun(); // 'goong'

console.log(name); // name is not defined

μœ„ 예제λ₯Ό 보면 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έλœ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜ name은 ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ ‘κ·Όν•˜λ‹ˆ μ—λŸ¬κ°€ λ‚©λ‹ˆλ‹€.
name λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜λ‘œ μ„ μ–Έ λœκ²ƒμ΄ μ•„λ‹ˆκΈ°μ— eun ν•¨μˆ˜ μŠ€μ½”ν”„ λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ if λ¬Έ, loop λ¬Έ λ“±κ³Ό 같은 λ‹€λ₯Έ μœ ν˜•μ˜ λΈ”λ‘μ—μ„œλŠ” μŠ€μ½”ν”„λ‘œ κ°„μ£Όλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

var age = 26;
  if (true) {
    var korAge = age + 1;
    console.log(`Your Korean Age is ${korAge}!`); // 'Your Korean Age is 27!'
  }
  console.log(korAge); // 27

μœ„ 예제λ₯Ό 보면 if λ¬Έ 내에 var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜ korAgeλŠ” if λ¬Έ μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. var ν‚€μ›Œλ“œλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„λ₯Ό μ œμ™Έν•œ λ‹€λ₯Έ μŠ€μ½”ν”„λŠ” 같은 μŠ€μ½”ν”„λ‘œ κ°„μ£Όν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

let, const, 블둝 μŠ€μ½”ν”„(Block Scope)

ES6μ—μ„œλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” λŒ€μ²΄ λ°©λ²•μœΌλ‘œ let, const ν‚€μ›Œλ“œκ°€ λ„μž…λ˜μ—ˆμœΌλ©°, 이 λ‘˜μ€ 블둝 μŠ€μ½”ν”„λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
ν•¨μˆ˜ μŠ€μ½”ν”„λ§Œ μŠ€μ½”ν”„λ‘œ μ·¨κΈ‰ν•˜λŠ” var ν‚€μ›Œλ“œμ™€λŠ” 달리 블둝 μŠ€μ½”ν”„μ—μ„œλŠ” λͺ¨λ“  블둝이 μŠ€μ½”ν”„κ°€ λ©λ‹ˆλ‹€.
λΈ”λ‘μ΄λž€? μ—¬λŠ” μ€‘κ΄„ν˜Έ '{'와 λ‹«λŠ” μ€‘κ΄„ν˜Έ '}'의 μ§‘ν•©μž…λ‹ˆλ‹€.

var age = 26;
  if (true) {
    let korAge = age + 1;
    console.log(`Your Korean Age is ${korAge}!`); // 'Your Korean Age is 27!'
  }
  console.log(korAge); // Uncaught ReferenceError: korAge is not defined

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” var ν‚€μ›Œλ“œλ₯Ό let ν‚€μ›Œλ“œλ‘œλ§Œ λŒ€μ²΄ν•˜μ—¬ λ³€μˆ˜λ₯Ό μ„ μ–Έν–ˆμŠ΅λ‹ˆλ‹€.
let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ korAge λ³€μˆ˜λŠ” μ½˜μ†”μ—μ„œ νƒ€μž… μ—λŸ¬λ₯Ό μΌμœΌν‚΅λ‹ˆλ‹€.
let, const ν‚€μ›Œλ“œλŠ” var ν‚€μ›Œλ“œμ™€ 달리 ν•¨μˆ˜ μŠ€μ½”ν”„κ°€ μ•„λ‹Œ 블둝 μŠ€μ½”ν”„λ₯Ό 가지고 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
μœ„μ˜ μ˜ˆμ—μ„œ let ν‚€μ›Œλ“œλ₯Ό const ν‚€μ›Œλ“œλ‘œ λŒ€μ²΄ν•΄λ„ λ™μΌν•œ κ²°κ³Ό 값이 좜λ ₯λ©λ‹ˆλ‹€.

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(Lexical Scope)

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λž€ μ€‘μ²©λœ ν•¨μˆ˜ κ·Έλ£Ήμ—μ„œ λ‚΄λΆ€ ν•¨μˆ˜κ°€ μƒμœ„ λ²”μœ„μ˜ λ³€μˆ˜ 및 기타 λ¦¬μ†ŒμŠ€μ— μ•‘μ„ΈμŠ€ ν•  수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

즉, ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ„ μ–Έν•˜μ˜€λŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€λŠ” 뜻이며, κ°€μž₯ μ€‘μš”ν•œ 점은 ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•˜λŠ”μ§€κ°€ μ•„λ‹ˆλΌ 어디에 μ„ μ–Έν•˜μ˜€λŠ”μ§€μ— 따라 κ²°μ •λ©λ‹ˆλ‹€.

λ‹€λ₯Έ 말둜, 정적 μŠ€μ½”ν”„(Static Scope)라 λΆ€λ₯΄κΈ°λ„ ν•©λ‹ˆλ‹€.

 

<예제>

var x = 1;

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

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

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

μœ„ 예제λ₯Ό 보듯 JavascriptλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό λ”°λ₯΄κΈ°μ— ν•¨μˆ˜λ₯Ό μ„ μ–Έν•œ μ‹œμ μ— μƒμœ„ μŠ€μ½”ν”„κ°€ κ²°μ •λ©λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•˜μ˜€λŠ”μ§€λŠ” μŠ€μ½”ν”„ 결정에 μ•„λ¬΄λŸ° 영ν–₯을 주지 μ•ŠμŠ΅λ‹ˆλ‹€. μœ„ 예제의 bar ν•¨μˆ˜λŠ” 전역에 μ„ μ–Έλ˜μ—ˆκΈ°μ— bar ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λŠ” μ „μ—­ μŠ€μ½”ν”„μ΄κ³ , λ”°λΌμ„œ μ „μ—­ λ³€μˆ˜ x의 κ°’ 1을 λ‘λ²ˆ 좜λ ₯ν•©λ‹ˆλ‹€.

Summary

  • var ν‚€μ›Œλ“œλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„(Function Scope). λ²”μœ„λŠ” ν•¨μˆ˜ μ•ˆ.
  • let, const ν‚€μ›Œλ“œλŠ” 블둝 μŠ€μ½”ν”„(Block Scope) λ²”μœ„λŠ” μ€‘κ΄„ν˜Έ μ•ˆ.
  • λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(Lexical Scope)λŠ” ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•˜λŠ”μ§€κ°€ μ•„λ‹Œ 어디에 μ„ μ–Έν•˜μ˜€λŠ”μ§€μ— 따라 결정됨.
λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€!