관리 메뉴

Daehyunii's Dev-blog

24μž₯ ν΄λ‘œμ € λ³Έλ¬Έ

ν΄λ‘œμ €μ˜ 핡심 ν‚€μ›Œλ“œλŠ” 'ν•¨μˆ˜κ°€ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½'이닀.

 

24.1 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„

  μžλ°”μŠ€ν¬λ₯΄λ¦½νŠΈ 엔진은 ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ”μ§€κ°€ μ•„λ‹ˆλΌ ν•¨μˆ˜λ₯Ό 어디에 μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€. 이λ₯Ό λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(정적 μŠ€μ½”ν”„)라 ν•œλ‹€. (κ΄€λ ¨λœ λ‚΄μš©μ€ 13μž₯ μŠ€μ½”ν”„ 정리λ₯Ό 보면 μžμ„Έν•˜κ²Œ μ•Œ 수 μžˆλ‹€.)

2022.07.03 - [μ–Έμ–΄ 곡뢀 및 정리/μžλ°”μŠ€ν¬λ¦½νŠΈ[λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ]] - 13μž₯ μŠ€μ½”ν”„

 

13μž₯ μŠ€μ½”ν”„

13.1 μŠ€μ½”ν”„λž€? μŠ€μ½”ν”„λž€ μ‹λ³„μž μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ³„μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 유효 λ²”μœ„λ₯Ό λ§ν•œλ‹€. 즉, μŠ€μ½”ν”„λŠ” μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λ₯Ό λ§ν•œλ‹€. μ•žμ„œ κ²½ν—˜ν•œ 바와 κ°™

pinetree93.tistory.com

그리고 κ²°κ΅­ μŠ€μ½”ν”„μ˜ μ‹€μ²΄λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄λ‹€.이 λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μžμ‹ μ˜ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό 톡해 μƒμœ„ λ ‰μ‹œμ»¬ ν™˜κ²½κ³Ό μ—°κ²°λœλ‹€. 이것이 λ°”λ‘œ μŠ€μ½”ν”„ 체인이닀. λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ 'μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°'에 μ €μž₯ν•  참쑰값이 λ°”λ‘œ μƒμœ„ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰이며, 이것이 μƒμœ„ μŠ€μ½”ν”„μ΄λ‹€.

 

24.2 ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]

  ν•¨μˆ˜κ°€ μ •μ˜λœ μœ„μΉ˜μ™€ ν˜ΈμΆœλ˜λŠ” μœ„μΉ˜λŠ” λ‹€λ₯Ό 수 μžˆλ‹€. λ”°λΌμ„œ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„κ°€ κ°€λŠ₯ν•˜λ €λ©΄ ν•¨μˆ˜λŠ” μžμ‹ μ΄ ν˜ΈμΆœλ˜λŠ” ν™˜κ²½κ³ΌλŠ” 상관없이 μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½, 즉 μƒμœ„ μŠ€μ½”ν”„(ν•¨μˆ˜ μ •μ˜κ°€ μœ„μΉ˜ν•˜λŠ” μŠ€μ½”ν”„κ°€ λ°”λ‘œ μƒμœ„ μŠ€μ½”ν”„λ‹€)λ₯Ό κΈ°μ–΅ν•΄μ•Ό ν•œλ‹€. 이λ₯Ό μœ„ν•΄ ν•¨μˆ˜λŠ” μžμ‹ μ˜ λ‚΄λΆ€ 슬둯 [[Environment]]에 μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½, 즉 μƒμœ„ μŠ€μ½”ν”„μ˜ μ°Έμ‘°λ₯Ό μ €μž₯ν•œλ‹€. λ‹€μ‹œ 말해, ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]에 μ €μž₯된 ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°κ°€ λ°”λ‘œ μƒμœ„ μŠ€μ½”ν”„λ‹€. λ˜ν•œ μžμ‹ μ΄ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ 생성될 ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ 'μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°'에 μ €μž₯될 참쑰값이닀. ν•¨μˆ˜ κ°μ²΄λŠ” λ‚΄λΆ€ 슬둯 [[Environment]]에 μ €μž₯ν•œ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°, 즉 μƒμœ„ μŠ€μ½”ν”„λ₯Ό μžμ‹ μ΄ μ‘΄μž¬ν•˜λŠ” ν•œ κΈ°μ–΅ν•œλ‹€.

 

24.3 ν΄λ‘œμ €μ™€ λ ‰μ‹œμ»¬ ν™˜κ²½

const x = 1;

function outer(){
    const x = 10;
    const inner = function(){
        console.log(x);
    };
    return inner;
}

// outer ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 쀑첩 ν•¨μˆ˜ innerλ₯Ό λ°˜ν™˜ν•œλ‹€.
// 그리고 outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ νŒλ˜μ–΄ μ œκ±°λœλ‹€.
const innerFunc = outer();
innerFunc(); // 10
// outerν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ œκ±°λ˜μ—ˆμŒμ—λ„ inner 쀑첩 ν•¨μˆ˜λŠ” outer μ™ΈλΆ€ ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜ xλ₯Ό μ°Έμ‘°ν•œλ‹€.

  μœ„μ˜ 예제처럼 μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 쀑첩 ν•¨μˆ˜κ°€ 더 였래 μœ μ§€λ˜λŠ” 경우 쀑첩 ν•¨μˆ˜λŠ” 이미 생λͺ… μ£ΌκΈ°κ°€ μ’…λ£Œν•œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ 쀑첩 ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €λΌκ³  λΆ€λ₯Έλ‹€. 즉, ν΄λ‘œμ €λž€ 이미 μ’…λ£Œν•œ μ™ΈλΆ€ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” 쀑첩 ν•¨μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  ν•¨μˆ˜λŠ” μžμ‹ μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•˜κ³  μžˆλŠ”λ‹€κ³  ν–ˆλŠ”λ°, λͺ¨λ“  ν•¨μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” μƒμœ„ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•˜λ“  상관없이 μœ μ§€λœλ‹€. λ”°λΌμ„œ ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•˜λ“  상관없이 ν•¨μˆ˜λŠ” μ–Έμ œλ‚˜ μžμ‹ μ΄ κΈ°μ–΅ν•˜λŠ” μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•  수 있으며 μ‹λ³„μžμ— λ°”μΈλ”©λœ 값을 λ³€κ²½ν•  μˆ˜λ„ μžˆλ‹€. 

 

  μœ„ 예제λ₯Ό λ‹€μ‹œ μ‚΄νŽ΄ 보면 outer ν•¨μˆ˜λŠ” inner ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜κ³  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ œκ±°λ˜μ§€λ§Œ κ·Έλ ‡λ‹€κ³  outer ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½κΉŒμ§€ μ†Œλ©Έν•˜λŠ” 것은 μ•„λ‹ˆλ‹€. κ·Έλž˜μ„œ μ°Έμ‘°κ°€ inner ν•¨μˆ˜κ°€ outer ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” 것이닀. outer ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ inner ν•¨μˆ˜μ˜ [[Environment]] λ‚΄λΆ€ μŠ¬λ‘―μ— μ˜ν•΄ 참쑰되고 있고 inner ν•¨μˆ˜λŠ” μ „μ—­ λ³€μˆ˜ innerFunc에 μ˜ν•΄ 참쑰되고 μžˆμœΌλ―€λ‘œ 가비지 μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.(가비지 μ»¬λ ‰μ…˜μ€ λˆ„κ΅°κ°€κ°€ μ°Έμ‘°ν•˜κ³  μžˆλŠ” λ©”λͺ¨λ¦¬ 곡간을 ν•¨λΆ€λ‘œ ν•΄μ œν•˜μ§€ μ•ŠλŠ”λ‹€.) 이것이 λ°”λ‘œ ν΄λ‘œμ €μ˜ 원리이닀.

 

  일반적으둜 ν΄λ‘œμ €λΌκ³  λΆˆλ¦¬λŠ” 것은 쀑첩 ν•¨μˆ˜κ°€ μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹€λ²½μžλ₯Ό μ°Έμ‘°ν•˜κ³  있고 쀑첩 ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 더 였래 μœ μ§€λ˜λŠ” κ²½μš°μ— ν•œμ •ν•œλ‹€. λ°˜λŒ€λ‘œ, 쀑첩 ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 생λͺ…μ£ΌκΈ°κ°€ μ§§κ±°λ‚˜, 쀑첩 ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 생λͺ…μ£ΌκΈ°λŠ” κΈΈμ§€λ§Œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” κ²½μš°λŠ” 일반적으둜 ν΄λ‘œμ €λΌκ³  ν•˜μ§€ μ•ŠλŠ”λ‹€. ν΄λ‘œμ €μ— μ˜ν•΄ μ°Έμ‘°λ˜λŠ” μƒμœ„ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ₯Ό 자유 λ³€μˆ˜λΌκ³  λΆ€λ₯Έλ‹€. 

 

24.4 ν΄λ‘œμ €μ˜ ν™œμš©

  ν΄λ‘œμ €λŠ” μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ λ³€κ²½ν•˜κ³  μœ μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. λ‹€μ‹œ 말해, μƒνƒœκ°€ μ˜λ„μΉ˜ μ•Šκ²Œ λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ μ€λ‹‰ν•˜κ³  νŠΉμ • ν•¨μˆ˜μ—κ²Œλ§Œ μƒνƒœ 변경을 ν—ˆμš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. 

// ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ 호좜된 횟루λ₯Ό λˆ„μ ν•˜μ—¬ 좜λ ₯ν•˜λŠ” μΉ΄μš΄ν„°
let num = 0;

const increase = function(){
    return ++num;
};

console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3

  μœ„ μ½”λ“œλŠ” 잘 λ™μž‘ν•˜μ§€λ§Œ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚¬ κ°€λŠ₯성이 μžˆλ‹€. μœ„ μ½”λ“œμ—μ„œ num λ³€μˆ˜μ˜ 값은 increase ν•¨μˆ˜κ°€ 호좜되기 μ „κΉŒμ§€ λ³€κ²½λ˜μ§€ μ•Šκ³  잘 μœ μ§€ λ˜μ–΄μ•Ό ν•˜κ³ , num λ³€μˆ˜μ˜ 값은 increase ν•¨μˆ˜λ§Œμ΄ λ³€κ²½ν•  수 μžˆλ„λ‘ λ§Œλ“€μ–΄μ•Ό κ°€μž₯ μ•ˆμ „ν•  것이닀. κ·ΈλŸ¬λ‚˜ num λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜λ₯Ό 톡해 κ΄€λ¦¬λ˜κ³  있기 λ•Œλ¬Έμ— μ–Έμ œλ“ μ§€ λˆ„κ΅¬λ‚˜ μ ‘κ·Όν•  수 있고 λ³€κ²½ν•  수 μžˆλ‹€. 이것이 곧 였λ₯˜λ‘œ 이어진닀. 이λ₯Ό ν΄λ‘œμ €λ‘œ ν•΄κ²°ν•  수 μžˆλ‹€.

const increase = (function(){
    let num = 0;

    return function(){
        return ++num;
    };
}());

console.log(increase());
console.log(increase());
console.log(increase());

  μœ„ μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©΄ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜κ°€ 호좜되고 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ ν•¨μˆ˜κ°€ increase λ³€μˆ˜μ— ν• λ‹Ήλœλ‹€. increase λ³€μˆ˜μ— ν• λ‹Ήλœ ν•¨μˆ˜λŠ” μžμ‹ μ΄ μ •μ˜λœ μœ„μΉ˜μ— μ˜ν•΄ κ²°μ •λœ μƒμœ„ μŠ€μ½”ν”„μΈ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ˜ λ¦­μ‹œμ»¬ ν™˜κ²½μ„ κΈ°μ–΅ν•˜λŠ” ν΄λ‘œμ €λ‹€. μœ„ μ½”λ“œμ˜ ν΄λ‘œμ € 처럼 μƒνƒœκ°€ μ˜λ„μΉ˜ μ•Šκ²Œ λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ μ•ˆμ „ν•˜κ²Œ μ€λ‹‰ν•˜κ³  νŠΉμ • ν•¨μˆ˜μ—κ²Œλ§Œ μƒνƒœ 변경을 ν—ˆμš©ν•˜μ—¬ μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ μœ μ§€ν•˜κΈ° μœ„ν•΄ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•œλ‹€.

 

  λ³€μˆ˜ 값은 λˆ„κ΅°κ°€μ— μ˜ν•΄ μ–Έμ œλ“ μ§€ 변경될 수 μžˆμ–΄ 였λ₯˜ λ°œμƒμ˜ 근볡적 원인이 될 수 μžˆλ‹€. μ™ΈλΆ€ μƒνƒœ λ³€κ²½μ΄λ‚˜ κ°€λ³€ 데이터λ₯Ό ν”Όν•˜κ³  λΆˆλ³€μ„±μ„ 지ν–₯ν•˜λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λΆ€μˆ˜ 효과λ₯Ό μ΅œλŒ€ν•œ μ–΅μ œν•˜μ—¬ 였λ₯˜λ₯Ό ν”Όν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ 높이기 μœ„ν•΄ ν΄λ‘œμ €λŠ” 적극적으둜 μ‚¬μš©λœλ‹€.