Lexical Scope

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λž€ λ³€μˆ˜μ˜ μƒμœ„μŠ€μ½”ν”„κ°€ λŸ°νƒ€μž„μ΄ μ•„λ‹Œ 컴파일 λ‹¨κ³„μ—μ„œ κ²°μ •λ˜λŠ” 것을 λ§ν•œλ‹€. μ‰½κ²Œ 말해 λ³€μˆ˜ μ‹€ν–‰μ‹œκ°€ μ•„λ‹Œ μ„ μ–Έμ‹œμ— μƒμœ„ μŠ€μ½”ν”„κ°€ κ²°μ •λ˜λŠ” 것이닀.

κ°„λ‹¨ν•œ μ˜ˆμ‹œλ₯Ό λ“€μ–΄ μ΄ν•΄ν•΄λ³΄μž.

let x = 1;

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

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

foo(); 
bar(); 

μœ„ μ½”λ“œμ˜ μ‹€ν–‰κ²°κ³ΌλŠ” 각각 1, 1이닀. ν•œλ²ˆ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ³€μˆ˜ μ„ μ–Έμ‹œμ— μƒμœ„μŠ€μ½”ν”„κ°€ κ²°μ •λœλ‹€.

// μ΅œμƒμœ„ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ
let x;

function foo(){}
function bar(){}

// foo μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ
let x;

졜초 μ†ŒμŠ€μ½”λ“œλ₯Ό ν‰κ°€ν•˜λ©΄μ„œ λ³€μˆ˜/ν•¨μˆ˜μ˜ μ„ μ–ΈλΆ€λ₯Ό λ¨Όμ € μ‹€ν–‰ν•œλ‹€. λ”°λΌμ„œ, μ΄λ•Œ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μ €μž₯λ˜λŠ” μ •λ³΄λŠ” μœ„μ™€ κ°™λ‹€.

이후 λŸ°νƒ€μž„μ—μ„œ μ‹€μ œλ‘œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μˆœκ°„μ„ μƒκ°ν•΄λ³΄μž.

foo ν•¨μˆ˜μ•ˆμ—μ„œ barν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ”λ° foo μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— barν•¨μˆ˜ 선언에 λŒ€ν•œ 정보가 μ—†μœΌλ―€λ‘œ μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μƒμ„±λœ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ°Έμ‘°ν•œλ‹€.

μ΄λ•Œ μ „μ—­ μ‹€ν–‰μ»¨ν…μŠ€νŠΈμ— μ €μž₯된 bar ν•¨μˆ˜κ°€ μ‹€ν–‰μ‹œ ν•„μš”ν•œ λ³€μˆ˜ xλŠ” μ „μ—­μœΌλ‘œ μ„ μ–Έλœ x이닀. λ”°λΌμ„œ, foo ν•¨μˆ˜μ•ˆμ—μ„œ μ„ μ–Έλœ x값인 10이 μ•„λ‹Œ 1이 좜λ ₯λ˜λŠ” 것이닀.

μ‰½κ²Œ 말해, bar ν•¨μˆ˜κ°€ μ„ μ–Έλ˜λŠ” μ‹œμ μ— μ°Έμ‘°ν• μˆ˜ μžˆλŠ” x의 값은 μ „μ—­μœΌλ‘œ μ„ μ–Έλœ x값인 1이기 λ•Œλ¬Έμ— 1이 좜λ ₯λ˜λŠ” 것이닀.

λ§Œμ•½ fooμ•ˆμ˜ barλ₯Ό μ‹€ν–‰ν–ˆμ„λ•Œ 10이 좜λ ₯되게 ν•˜κ³ μ‹Άλ‹€λ©΄?

let x = 1;

function foo() {
  let x = 10;
  function bar() {
    console.log(x);
  }
  bar();
}

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

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

μ΄λ ‡κ²Œ ν•˜λ©΄ foo ν•¨μˆ˜μ—μ„œ μ‹€ν–‰λ˜λŠ” barλŠ” 10을, μ „μ—­μ—μ„œ μ‹€ν–‰λ˜λŠ” barλŠ” 1을 좜λ ₯ν•œλ‹€.

Last updated