scope

λ³€μˆ˜κ°€ μœ νš¨ν•œ λ²”μœ„

  • μ½”λ“œ λΈ”λŸ­ {}μ•ˆμ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λΈ”λ‘μ•ˆμ—μ„œλ§Œ 유효

λ ‰μ‹œμ»¬ ν™˜κ²½

λ‚΄λΆ€ μˆ¨κΉ€ μ—°κ΄€ 객체 ( 싀행쀑인 ν•¨μˆ˜, μ½”λ“œλΈ”λŸ­, 슀크립트 μ „μ²΄λŠ” 이λ₯Ό κ°–λŠ”λ‹€.)

λͺ…μ„Έμ„œμ—λ§Œ μ‘΄μ œν•˜λŠ” jsλ™μž‘ 방법을 μ„€λͺ…ν•˜λŠ” μ΄λ‘ μƒμ˜ 객체이기 λ•Œλ¬Έμ— μ‘°μž‘μ€ λΆˆκ°€λŠ₯ν•˜λ‹€.

ꡬ성

  • ν™˜κ²½ λ ˆμ½”λ“œ : λͺ¨λ“  지역 λ³€μˆ˜λ₯Ό ν”„λ‘œνΌν‹°λ‘œ μ €μž₯ν•˜κ³  μžˆλŠ” 객체. this와 같은 기타 정보도 포함

  • μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° : μ™ΈλΆ€ μ½”λ“œμ™€ μ—°κ΄€

λ³€μˆ˜ μ„ μ–Έμ‹œ λ™μž‘ κ³Όμ •

λ³€μˆ˜λŠ” ν™˜κ²½ λ ˆμ½”λ“œ(특수 λ‚΄λΆ€ 객체)의 ν”„λ‘œνΌν‹°

μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½ : 슀크립트 전체와 κ΄€λ ¨λœ λ ‰μ‹œμ»¬ ν™˜κ²½. μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μ™ΈλΆ€ μ°Έμ‘°λ₯Ό 갖지 μ•ŠλŠ”λ‹€. (null)

let user;
user = 'hello';
user = 'bye';
  1. 첫 λ³€μˆ˜ μ„ μ–Έμ‹œ uninitializedμƒνƒœ = 특수 λ‚΄λΆ€ μƒνƒœλ‘œ js엔진은 이 λ³€μˆ˜λ₯Ό μΈμ§€ν•˜μ§€λ§Œ μ ‘κ·Ό,μ°Έμ‘°λ₯Ό ν• μˆ˜ μ—†λŠ” μƒνƒœ

  2. let userλ₯Ό μ‹€ν–‰ν•˜μ—¬ ν”„λ‘œνΌν‹° 값은 undefined둜 λ°”λ€Œμ–΄ μ΄λ•ŒλΆ€ν„° μ‚¬μš© κ°€λŠ₯

  3. user의 값이 hello둜 바뀐닀.

  4. user의 값이 bye둜 바뀐닀.

ν•¨μˆ˜ μ„ μ–Έμ‹œ λ™μž‘ κ³Όμ •

ν•¨μˆ˜λ„ λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν”„λ‘œνΌν‹°λ‘œ μ·¨κΈ‰ ν•˜μ—¬ λ™μž‘ 방법은 λ™μΌν•˜λ‚˜ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ„ μ–Έν•œ ν•¨μˆ˜λŠ” λ°”λ‘œ μ΄ˆκΈ°ν™” μƒνƒœκ°€ λ˜μ–΄ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

function sayHi() {
  alert('hello');
}

λΈ”λŸ­ μ½”λ“œλ‘œ λ“€μ–΄κ°€κ²Œ 되면 μƒˆλ‘œμš΄ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μžλ™μ μœΌλ‘œ λ§Œλ“€μ–΄μ Έ 이 ν™˜κ²½μ€ λ‚΄λΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄κ³  μ½”λ“œλΈ”λŸ­ λ°–μ˜ ν™˜κ²½μ€ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ λ‚΄λΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κ°–λŠ”λ‹€.

κ·Έλž˜μ„œ, μ½”λ“œλΈ”λŸ­ λ‚΄λΆ€μ—μ„œ νŠΉμ • λ³€μˆ˜μ— μ ‘κ·Όν• λ•Œ μ²˜μŒμ— λ‚΄λΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— μ ‘κ·Όν›„ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ μ°Έμ‘°λ₯Ό μ΄μš©ν•΄ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ λ³€μˆ˜λ₯Ό 찾게 λœλ‹€.

λͺ¨λ“  ν•¨μˆ˜λŠ” ν•¨μˆ˜κ°€ μƒμ„±λœ 곳의 λ ‰μ‹œμ»¬ ν™˜κ²½μ„ κΈ°μ–΅ν•œλ‹€κ³  ν–ˆλŠ”λ° κΈ°μ–΅ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€. ν•¨μˆ˜λŠ” [[Environment]]라 λΆˆλ¦¬λŠ” μˆ¨κΉ€ ν”„λ‘œνΌν‹°λ₯Ό κ°–κ³  이λ₯Ό 톡해 ν•¨μˆ˜κ°€ λ§Œλ“€μ–΄μ§„ 곳의 λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°κ°€ μ €μž₯λœλ‹€.

ν΄λ‘œμ €

μ™ΈλΆ€ λ³€μˆ˜λ₯Ό κΈ°μ–΅ν•˜κ³  이 μ™ΈλΆ€ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” ν•¨μˆ˜λ‘œ μŠ€μ½”ν”„μ— 묢인 λ³€μˆ˜λ₯Ό λ°”μΈλ”©ν•˜κΈ° μœ„ν•œ 기술.

new Function()을 μ œμ™Έν•˜κ³ λŠ” js의 λͺ¨λ“  ν•¨μˆ˜λŠ” ν΄λ‘œμ €μ΄λ‹€.

μœ„μ˜ μ„€λͺ…κ³Ό 같이 ν•¨μˆ˜ μƒμ„±μ‹œ μžλ™μœΌλ‘œ [[Environment]]λΌλŠ” μˆ¨κΉ€ ν”„λ‘œνΌν‹°λ₯Ό μƒμ„±ν•˜κ³  이λ₯Ό 톡해 μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μ°Έμ‘°ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

가비지 μ»¬λ ‰μ…˜

가비지 μ»¬λ ‰μ…˜μ—μ„œ 가비지 μ»¬λ ‰μ…˜μ— λŒ€ν•΄ μ •λ¦¬ν–ˆλŠ”λ° μ€‘μ²©ν•¨μˆ˜ μ—μ„œλ„ 도달 κ°€λŠ₯ν•œ μƒνƒœλ₯Ό μœ μ§€ μ‹œμΌœ μ£ΌλŠ” 것이 [[Environment]]에 μ™ΈλΆ€ ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 정보가 μ €μž₯되기 λ•Œλ¬Έμ— ν•¨μˆ˜ 호좜이 λλ‚˜λ„ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ λ©”λͺ¨λ¦¬μ— μœ μ§€λ˜λŠ” μ΄μœ μ΄λ‹€.

function f() {
  let value = 123;

  return function () {
    alert(value);
  };
}

let g = f(); // g.[[Environment]]에 f() 호좜 μ‹œ λ§Œλ“€μ–΄μ§€λŠ” λ ‰μ‹œμ»¬ ν™˜κ²½ 정보가 μ €μž₯λ©λ‹ˆλ‹€.

μ‹€μ œ V8엔진 λ™μž‘

μœ„μ˜ λ‚΄μš©μ€ λͺ…μ„Έμ„œμ— λ‚˜μ˜¨ κΈ°λ³Έ μ •μ˜μ΄μ§€ js엔진을 μ΅œμ ν™” μ‹œν‚€κΈ° μœ„ν•΄ μ–΄λ–»κ²Œ 섀계 ν–ˆλŠ”μ§€μ— 따라 λ™μž‘ 방식이 λ‹€λ₯Ό 수 μžˆλ‹€.

μ‹€μ œ V8엔진은 μ΅œμ ν™”λ₯Ό μœ„ν•΄ μ‚¬μš©μ•ˆν•  것 같은 ν•¨μˆ˜λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ 정리해버린닀.

function f() {
  let value = 123;

  return function () {
    alert(value);
  };
}

let g = f(); // Uncaught ReferenceError: value is not definedκ°€ 좜λ ₯

Last updated