Skip to content

Latest commit

Β 

History

History
264 lines (182 loc) Β· 11.3 KB

scope.md

File metadata and controls

264 lines (182 loc) Β· 11.3 KB

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ™œ μ΄λ ‡κ²Œ λ‹€λ₯Έ μ–Έμ–΄λ“€κ³Ό λ‹€λ₯΄κ²Œ μž‘λ™ν• κΉŒμš”? κ·Έ 원인 쀑 ν•˜λ‚˜λ₯Ό μžμ„Ένžˆ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€!

μŠ€μ½”ν”„(Scope)

μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λ₯Ό λ§ν•˜λ©°, μ—¬λŸ¬ κ·œμΉ™μ— 따라 λ™μž‘ν•©λ‹ˆλ‹€.

μŠ€μ½”ν”„λŠ” λ³€μˆ˜, ν•¨μˆ˜μ™€ μ•„μ£Ό κΉŠμ€ 관련이 있죠. μš°λ¦¬κ°€ λ³΄μ•˜λ˜ ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜λŠ” 내뢀에선 μœ νš¨ν•˜λ‚˜ μ™ΈλΆ€μ—μ„œλŠ” μœ νš¨ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. 이것이 λ°”λ‘œ λ§€κ°œλ³€μˆ˜κ°€ μ°Έμ‘°ν•  수 μžˆλŠ” μœ νš¨λ²”μœ„μΈ μŠ€μ½”ν”„κ°€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ‘œ ν•œμ •λ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

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

예제λ₯Ό ν•˜λ‚˜ λ³ΌκΉŒμš”? μ•„, 그리고 이번 μž₯μ—μ„œλŠ” var ν‚€μ›Œλ“œλ₯Ό 자주 μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λŠ” let, constκ°€ κ°€μ§€λŠ” μŠ€μ½”ν”„μ™€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹ˆ μ°Έκ³ ν•΄μ£Όμ„Έμš”!

var a = 1;
function foo(){
  var a = 10;
  console.log(x); // ?
}

foo();

console.log(a);   // ?

μ „μ—­ λ³€μˆ˜λ‘œμ„œμ˜ a와, 지역 λ³€μˆ˜λ‘œμ„œμ˜ aκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. 이 λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„λ₯Ό 톡해 μ–΄λ–€ λ³€μˆ˜λ₯Ό 참쑰할지 κ²°μ •ν•˜λŠ” μ‹λ³„μž κ²°μ •(Identifier Resolution) 이 μΌμ–΄λ‚©λ‹ˆλ‹€. κ²°κ΅­ μŠ€μ½”ν”„λž€ μ‹λ³„μžλ₯Ό 검색할 λ•Œ μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ΄λΌκ³ λ„ ν•  수 μžˆλŠ” κ±°μ£ .

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ μ½”λ“œμ˜ λ¬Έλ§₯(context)을 κ³ λ €ν•©λ‹ˆλ‹€.

μ½”λ“œκ°€ μ–΄λ””μ„œ μ‹€ν–‰λ˜λ©°, 주변에 μ–΄λ–€ μ½”λ“œκ°€ μžˆλŠ”μ§€λ₯Ό λ ‰μ‹œμ»¬ ν™˜κ²½(Lexical Environment)라고 ν•©λ‹ˆλ‹€. 이런 μ½”λ“œ λ¬Έλ§₯은 λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ 이루어지며, 이λ₯Ό κ΅¬ν˜„ν•œ 것이 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ(Execution Context) μž…λ‹ˆλ‹€. λͺ¨λ“  μ½”λ“œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ ν‰κ°€λ˜κ³  μ‹€ν–‰λ˜λ©°, μŠ€μ½”ν”„λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ κΉŠμ€ 연관이 μžˆμœΌλ‹ˆ μ°¨ν›„ μžμ„Ένžˆ λ‹€λ£Ήλ‹ˆλ‹€.

μœ„ 예제 μ½”λ“œμ˜ 맨 μœ„μ— μ„ μ–Έλœ λ³€μˆ˜ aλŠ” μ–΄λ””μ„œλ“  μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ foo ν•¨μˆ˜ 내뢀에 μ„ μ–Έλœ λ³€μˆ˜ aλŠ” foo ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ μ°Έμ‘°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 즉, μ‹λ³„μžκ°€ 동일해도 μœ νš¨ν•œ λ²”μœ„μΈ μŠ€μ½”ν”„κ°€ λ‹€λ₯΄λ―€λ‘œ λ³„κ°œμ˜ λ³€μˆ˜κ°€ λ˜λŠ” μ…ˆμ΄μ£ .



μš°λ¦¬λŠ” λ³€μˆ˜λ₯Ό λ°°μš°λ©΄μ„œ μ‹λ³„μžλŠ” μœ μΌν•œ 값이라고 μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€. μŠ€μ½”ν”„κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ λ™μΌν•œ μ‹λ³„μžλŠ” μΆ©λŒμ„ μΌμœΌν‚€λ―€λ‘œ ν•˜λ‚˜ 밖에 μ‚¬μš©ν•  수 μ—†κ²Œ 되겠죠. 이처럼 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” μŠ€μ½”ν”„(유효 λ²”μœ„)λ₯Ό 톡해 λ³€μˆ˜ 이름과 μΆ©λŒμ„ λ°©μ§€ν•©λ‹ˆλ‹€.

μ •λ¦¬ν•˜μžλ©΄ μŠ€μ½”ν”„ λ‚΄μ—μ„œμ˜ μ‹λ³„μžλŠ” μœ μΌν•΄μ•Ό ν•˜μ§€λ§Œ, λ‹€λ₯Έ μŠ€μ½”ν”„λŠ” 같은 μ‹λ³„μžλ₯Ό μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ λ„€μž„ 슀페이슀(개체λ₯Ό ꡬ뢄할 수 μžˆλŠ” λ²”μœ„) 라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


μ°Έκ³  : var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜ 쀑볡 μ„ μ–Έ

  • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„λΌλ„ 쀑볡이 ν—ˆμš©λ©λ‹ˆλ‹€.
function foo(){
  var a = 1;
  var a = 10;
  // μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 var ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•˜κ³  a = 10; 이라고 평가 ν•©λ‹ˆλ‹€.
  console.log(a); // 10
}
  • let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡이 ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
function bar(){
  let a = 1;
  let a = 10; // SyntaxError: Identifier 'a' has already been declared
}

μŠ€μ½”ν”„μ˜ μ’…λ₯˜

ν”„λ‘œκ·Έλž˜λ° μ½”λ“œλŠ” μ „μ—­(Global)κ³Ό 지역(Local)으둜 λ‚˜λ‰©λ‹ˆλ‹€.

μš°λ¦¬λŠ” 이미 μ „μ—­, 지역에 λŒ€ν•΄ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. ν‘œλ‘œ λ³ΌκΉŒμš”?

ꡬ뢄 μ„€λͺ… μŠ€μ½”ν”„ λ³€μˆ˜
μ „μ—­ μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­ μ „μ—­ μŠ€μ½”ν”„
(Global Scope)
μ „μ—­ λ³€μˆ˜
(Global Variable)
지역 ν•¨μˆ˜ λ‚΄λΆ€ 지역 μŠ€μ½”ν”„
(Local Scope or Function-level Scope)
지역 λ³€μˆ˜
(Local Variable)

λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜(μ „μ—­ λ˜λŠ” 지역)에 μ˜ν•΄ μŠ€μ½”ν”„κ°€ κ²°μ •λ©λ‹ˆλ‹€.


  • μ „μ—­ μŠ€μ½”ν”„(Global Scope) : μ–΄λ–€ λΈ”λ‘μœΌλ‘œλ„ 감싸져 μžˆμ§€ μ•Šμ€ 경우, μ „μ—­ μŠ€μ½”ν”„ μ•ˆμ— μ‘΄μž¬ν•©λ‹ˆλ‹€.

    • μ œμ–΄λ¬Έ, ν•¨μˆ˜λŠ” μ€‘κ΄„ν˜Έ({})둜 ν‘œκΈ°ν•©λ‹ˆλ‹€. 즉 μ€‘κ΄„ν˜Έ 밖에 μžˆλŠ” λͺ¨λ“  λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜λ‘œμ„œ μ‘΄μž¬ν•˜κ²Œ λ©λ‹ˆλ‹€. 즉, μ–΄λ””μ„œλΌλ„ μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 지역 μŠ€μ½”ν”„(Local Scope) : μ–΄λ–€ λΈ”λ‘μœΌλ‘œ 감싸져 μžˆλŠ” 경우, 지역 μŠ€μ½”ν”„ μ•ˆμ— μ‘΄μž¬ν•©λ‹ˆλ‹€.

    • μ€‘κ΄„ν˜Έ μ•ˆμ— μžˆλŠ” λͺ¨λ“  λ³€μˆ˜λŠ” 지역 λ³€μˆ˜λ‘œμ„œ μ‘΄μž¬ν•˜κ³ , μžμ‹ μ˜ 지역 μŠ€μ½”ν”„μ™€ ν•˜μœ„ 지역 μŠ€μ½”ν”„μ— ν•œν•΄ μœ νš¨ν•©λ‹ˆλ‹€.
    • μœ„μ˜ κ·Έλ¦Όμ—μ„œ, inner() ν•¨μˆ˜ λ‚΄λΆ€μ˜ 지역 λ³€μˆ˜ a와 같은 μ΄λ¦„μ˜ μ „μ—­ λ³€μˆ˜κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. μ΄λ•Œ inner() ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜ aλŠ” μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹Œ 지역 λ³€μˆ˜ aμž…λ‹ˆλ‹€. λ°”λ‘œ μŠ€μ½”ν”„ 체인(Scope Chain)을 톡해 μ°Έμ‘°ν•  λ³€μˆ˜λ₯Ό κ²€μƒ‰ν•˜λŠ” μ‹λ³„μž κ²°μ •(Identifier Resolution) 과정을 κ±°μ³€κΈ° λ•Œλ¬Έμ΄μ—μš”!

μŠ€μ½”ν”„ 체인(Scope Chain)

μŠ€μ½”ν”„λŠ” ν•¨μˆ˜μ˜ 쀑첩에 μ˜ν•΄ κ³„μΈ΅μ μœΌλ‘œ ꡬ쑰λ₯Ό 가지며, μ΄λ ‡κ²Œ μ—°κ²°λœ 것을 μŠ€μ½”ν”„ 체인이라고 ν•©λ‹ˆλ‹€.


λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜(μ „μ—­ λ˜λŠ” 지역)에 μ˜ν•΄ μŠ€μ½”ν”„κ°€ κ²°μ •λ©λ‹ˆλ‹€.


λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„ 체인을 톡해 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ˜ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜κ³ , μƒμœ„ μŠ€μ½”ν”„ λ°©ν–₯으둜 μ΄λ™ν•˜λ©° μ„ μ–Έλœ λ³€μˆ˜λ₯Ό κ²€μƒ‰ν•˜μ—¬ κ²°μ •(Identifier Resolution)ν•©λ‹ˆλ‹€. 그렇기에 μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λ₯Ό ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œλ„ μ°Έμ‘°ν•  수 있죠.

μŠ€μ½”ν”„ 체인은 물리적인 μ‹€μ²΄λ‘œ μ‘΄μž¬ν•©λ‹ˆλ‹€! μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μœ„ μžλ£Œκ΅¬μ‘°μ™€ μœ μ‚¬ν•œ λ ‰μ‹œμ»¬ ν™˜κ²½(Lexical Environment)λ₯Ό μ‹€μ œλ‘œ μƒμ„±ν•©λ‹ˆλ‹€. μˆœμ„œλŠ” μ•„λž˜μ™€ κ°™μ•„μš”.

κ·Έ 전에! λ ‰μ‹œμ»¬ ν™˜κ²½λŠ” λ­˜κΉŒμš”? μŠ€μ½”ν”„ 체인은 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½λ₯Ό 단방ν–₯으둜 μ—°κ²°ν•©λ‹ˆλ‹€. μ „μ—­ λ ˆμ‹œμ»¬ ν™˜κ²½μ€ μ½”λ“œκ°€ λ‘œλ“œλ˜λ©΄ κ³§λ°”λ‘œ μƒμ„±λ˜κ³ , ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ ν•¨μˆ˜κ°€ 호좜되면 κ³§λ°”λ‘œ μƒμ„±λ©λ‹ˆλ‹€.

  1. λ³€μˆ˜ 선언이 μ‹€ν–‰λ˜λ©΄ λ³€μˆ˜ μ‹λ³„μžκ°€ 자료ꡬ쑰(λ ‰μ‹œμ»¬ ν™˜κ²½)에 ν‚€(Key)둜 λ“±λ‘λ©λ‹ˆλ‹€.
  2. λ³€μˆ˜ 할당이 μΌμ–΄λ‚˜λ©΄ 자료ꡬ쑰의 λ³€μˆ˜ μ‹λ³„μžμ— ν•΄λ‹Ήν•˜λŠ” 값을 λ³€κ²½ν•©λ‹ˆλ‹€.

λ³€μˆ˜μ˜ 검색도 μ΄λŸ¬ν•œ 자료ꡬ쑰 μƒμ—μ„œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. 그럼 ν•¨μˆ˜λŠ” μ–΄λ–¨κΉŒμš”? λ‹€μŒ 예제λ₯Ό λ΄…μ‹œλ‹€.

// μ „μ—­ ν•¨μˆ˜
function foo(){
  console.log('μ „μ—­ ν•¨μˆ˜ foo');
}

function bar(){
  // 쀑첩 ν•¨μˆ˜
  function foo(){
    console.log('지역 ν•¨μˆ˜ foo');
  }

  foo();
}

bar();  // ?

자, μ—¬κΈ°μ„œ κΈ°μ–΅ν•  것은 ν•¨μˆ˜ 생성 μ‹œμ κ³Ό ν˜Έμ΄μŠ€νŒ…μž…λ‹ˆλ‹€.

ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•˜λ©΄ λŸ°νƒ€μž„ 이전에 ν•¨μˆ˜ 객체가 λ¨Όμ € μƒμ„±λœ λ’€, ν•¨μˆ˜ 이름과 λ™μΌν•œ μ‹λ³„μžλ₯Ό μ•”λ¬΅μ μœΌλ‘œ μ„ μ–Έν•˜κ³  μƒμ„±λœ ν•¨μˆ˜ 객체λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€.

이처럼 ν•¨μˆ˜λ„ μ‹λ³„μžμ— ν• λ‹Ήλ˜κΈ° λ•Œλ¬Έμ— μŠ€μ½”ν”„λ₯Ό κ°–μœΌλ©°, 일반 λ³€μˆ˜μ™€ λ‹€λ₯Όκ²Œ μ—†μŠ΅λ‹ˆλ‹€. 이둜써 μŠ€μ½”ν”„λŠ” λ³€μˆ˜ 식별에 μœ νš¨ν•œ λ²”μœ„ λ˜λŠ” κ·œμΉ™μ΄ μ•„λ‹Œ, μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜λŠ” μœ νš¨ν•œ λ²”μœ„ λ˜λŠ” κ·œμΉ™μ΄ λ˜κ² λ„€μš”!


ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„(Function Level Scope)

μ½”λ“œ 블둝이 μ•„λ‹Œ ν•¨μˆ˜μ— μ˜ν•΄ 지역 μŠ€μ½”ν”„κ°€ μƒμ„±λ©λ‹ˆλ‹€.

λ‹€λ₯Έ 언어와 달리, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•˜λ©° 이λ₯Ό ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λΌκ³  ν•©λ‹ˆλ‹€.

// 1
var a = 1;
if(true){
  var a = 10;
}

console.log(a);   // 10

// 2
var b = 1;
function change(){
  var b = 10;
  console.log(b);
}

change();         // 10
console.log(b);   // 10

// 3
var i = 10;
for(var i = 0; i < 5; i++){
  console.log(i); // 0, 1, 2, 3, 4
}

console.log(i);   // 5
  • var ν‚€μ›Œλ“œμ˜ νŠΉμ§•μœΌλ‘œ, ν•¨μˆ˜ λ°–μ—μ„œ μ„ μ–Έν•œ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ λ³€μˆ˜λŠ” μ „μ—­ λ²”μœ„λ₯Ό 가지며 ν•¨μˆ˜ 밖을 μ œμ™Έν•œ μ–΄λ””μ„œλ“  μ ‘κ·Όν•  수 있으며 μ˜λ„μΉ˜ μ•Šκ²Œ 값이 변경될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λŠ” κ²°κ΅­ λ©”λͺ¨λ¦¬ λˆ„μˆ˜, μ–΄λ €μš΄ 디버깅 λ“±μ˜ λ¬Έμ œμ μ„ 가지고 있으며, 블둝 레벨 μŠ€μ½”ν”„κ°€ νƒ„μƒν•˜λŠ” 원인이 되죠.

블둝 레벨 μŠ€μ½”ν”„(Block Level Scope)

μ½”λ“œ 블둝에 μ˜ν•΄ 지역 μŠ€μ½”ν”„κ°€ μƒμ„±λ©λ‹ˆλ‹€.

let a = 1;
function change(){
  let a = 10;
  console.log(a);
}

change();       // 10
console.log(a); // 1
  • let, const에 λŒ€ν•΄μ„œλŠ” λ’€μ—μ„œ λ‹€λ£¨κΈ°λ‘œ ν•˜μ£ .

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

정적 μŠ€μ½”ν”„(Static Scope)라고도 ν•©λ‹ˆλ‹€. μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•˜λŠ” μ€‘μš”ν•œ μŠ€μ½”ν”„μž…λ‹ˆλ‹€.

μ•„λž˜μ˜ μ½”λ“œλ₯Ό 보고, 생각해보도둝 ν• κΉŒμš”?

var a = 1;

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

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

foo();  // ?
bar();  // ?

μš°λ¦¬λŠ” 이 μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό μ΄λ ‡κ²Œ μ˜ˆμΈ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ”μ§€μ— 따라 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€.
  2. ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ”μ§€μ— 따라 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€.

1λ²ˆμ€ 동적 μŠ€μ½”ν”„(Dynamic Scope)라 ν•˜λ©°, ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” μ‹œμ μ— λ™μ μœΌλ‘œ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€. 2λ²ˆμ€ μ§€κΈˆ ν•­λͺ©μ—μ„œ λ‹€λ£¨λŠ” 정적 μŠ€μ½”ν”„(Static Scope λ˜λŠ” Lexical Scope)라고 ν•˜λ©°, ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λ˜λŠ” μ‹œμ μ— μ •μ μœΌλ‘œ μƒμœ„ μŠ€μ½”ν”„ κ²°μ •ν•©λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό λ”°λ¦…λ‹ˆλ‹€. 즉, ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λŠ” μ–Έμ œλ‚˜ μžμ‹ μ΄ μ •μ˜λœ μŠ€μ½”ν”„μž…λ‹ˆλ‹€. ν•¨μˆ˜ μ •μ˜κ°€ μ‹€ν–‰λ˜μ–΄ μƒμ„±λœ ν•¨μˆ˜ κ°μ²΄λŠ” μ΄λ ‡κ²Œ κ²°μ •λœ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ μƒμœ„ μŠ€μ½”ν”„λ₯Ό μ°Έμ‘°ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ΄μ£ .

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λŠ” μΆ”ν›„ λ“±μž₯ν•˜λŠ” ν΄λ‘œμ €(Closure)와 κΉŠμ€ 관계가 있으며, 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. μΆ”ν›„ μžμ„Ένžˆ λ‹€λ£Ήλ‹ˆλ‹€!




2021-09-11, karohani와 μŠ€ν„°λ”” 쀑 μ‹λ³„λœ μΆ”κ°€μ μœΌλ‘œ 곡뢀가 ν•„μš”ν•œ λ‚΄μš©λ“€

βœ… thisκ°€ 바인딩 λ˜λŠ” μ‹œμ μ€ λ ‰μ‹œμ»¬ ν™˜κ²½ μ •μ˜μ™€ λ‹€λ₯΄λ‹€?

의문점

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½(Lexical Environment)λŠ” μ„ μ–Έλœ μ‹œμ μ—μ„œ μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ°, thisλŠ”... λ‹€λ₯Έκ°€μš”? μ•„λž˜ 예제 μ½”λ“œλ₯Ό 보죠!
const whatThis1 = function(){
  console.log(this);
}
const obj = {
  whatThis2: function(){
    console.log(this);
  }
}

console.log(whatThis2());     // Window
console.log(obj.whatThis2()); // {whatThis2: Ζ’}

정리 된 λ‚΄μš©

  • 정리해야함

  • μ°Έμ‘° Link