[Javascript] μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ
728x90

 

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ•Œμ•„λ³΄μž!

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μœ„ν•΄ 책을 읽던 λ‚˜λ‚ λ“€... κ·ΈλŸ¬λ‚˜ ν…μŠ€νŠΈλ§ŒμœΌλ‘œλŠ” μ‰½κ²Œ 이해할 수 μ—†μ—ˆλ˜ λ‚˜.. 

ν•˜μ§€λ§Œ μ΄λŒ€λ‘œ λ„˜μ–΄κ°ˆ 수 없지.. πŸ€”

이번 κΈ°νšŒμ— μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Όμ˜ λ™μž‘ 원리λ₯Ό 보닀 깊게 μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λŒ€ν•΄ μ •λ¦¬ν•΄λ³΄μž!

 

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ•ŒκΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € 콜 μŠ€νƒμ— λŒ€ν•΄μ„œ μ•Œμ•„μ•Ό ν•œλ‹€.

 

 

콜 μŠ€νƒ

좜처 [https://stackoverflow.com/questions/62725430/what-is-the-different-between-stack-and-call-stack-in-javascript]

μš°μ„  μŠ€νƒμ€ μœ„μ™€ 같이 ν•˜λ‚˜ν•˜λ‚˜ μ°¨λ‘€λŒ€λ‘œ μŒ“κ³  λΉΌκ³ λ₯Ό λ°˜λ³΅ν•˜λŠ” μžλ£Œκ΅¬μ‘°λ‹€.

콜 μŠ€νƒμ€ κ°€μž₯ μœ„μ— μŒ“μ—¬μžˆλŠ” μ»¨ν…μŠ€νŠΈμ™€ κ΄€λ ¨λœ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œμ™€ ν™˜κ²½μ„ κ΄€λ¦¬ν•œλ‹€.
ν˜„μž¬ 싀행쀑인 μ½”λ“œμ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 콜 μŠ€νƒμ˜ μ΅œμƒμœ„μ— μ‘΄μž¬ν•œλ‹€! 이런 μ½˜ν…μŠ€νŠΈλ₯Ό μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ (running execution context)라고 ν•œλ‹€.

 

 

그럼 μ»¨ν…μŠ€νŠΈκ°€ 뭐길래 콜 μŠ€νƒμ— μŒ“λ‚˜μš”.. πŸ€”

 

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ν•  μ½”λ“œμ— ν•„μš”ν•œ ν™˜κ²½ 정보듀을 λͺ¨μ•„놓은 객체닀.
μ»¨ν…μŠ€νŠΈλŠ” 크게 3κ°€μ§€μ˜ νƒ€μž…μ΄ μžˆλ‹€. 이 νƒ€μž…λ“€μ€ 각각의 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€.

  • μ „μ—­ μ½”λ“œ : 전역에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ (전역에 μ„ μ–Έλœ ν•¨μˆ˜, ν΄λž˜μŠ€λŠ” 미포함) μŠ€ν¬λ¦½νŠΈκ°€ 싀행될 λ•Œ μžλ™μœΌλ‘œ λΆ€μ—¬λœλ‹€.
  • ν•¨μˆ˜ μ½”λ“œ(κ°€μž₯ ν”ν•˜κ²Œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” 방법) : ν•¨μˆ˜κ°€ 호좜될 λ•Œ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜μ–΄ 콜 μŠ€νƒμ— μŒ“μΈλ‹€. (ν•¨μˆ˜ 내뢀에 μ€‘μ²©λœ ν•¨μˆ˜, ν΄λž˜μŠ€λŠ” 미포함)
  • eval() μ½”λ“œ : eval ν•¨μˆ˜μ— 인수둜 μ „λ‹¬λ˜μ–΄ μ‹€ν–‰λ˜λŠ” μ†ŒμŠ€μ½”λ“œ.
  • λͺ¨λ“ˆ μ½”λ“œ : λͺ¨λ“ˆ 내뢀에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ. (λͺ¨λ“ˆ λ‚΄λΆ€μ˜ ν•¨μˆ˜, ν΄λž˜μŠ€λŠ” 미포함)

μ˜ˆμ‹œ μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ μ’€ 더 ꡬ체적으둜 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ–΄λ–»κ²Œ κ΅¬μ„±λ˜λŠ”μ§€ 보면 이렇닀.

var a = 1;

function outer(){
    function inner(){
        console.log(a); // undefined
        var = 3;
    }

    inner();
    console.log(a);
}
outer();
conosle.log(a);

1. μ½”λ“œ μ‹€ν–‰
2. μ „μ—­μ»¨ν…μŠ€νŠΈκ°€ μ½œμŠ€νƒμœΌλ‘œ in
3. outer ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ λ“€μ–΄μ˜€λ©΄μ„œ μ „μ—­ μ»¨ν…μŠ€νŠΈκ°€ 쀑단됨
4. inner ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ λ“€μ–΄μ˜€κ³  outer μ»¨ν…μŠ€νŠΈ 쀑단
5. inner ν•¨μˆ˜μ˜ λ‚΄λΆ€ 진행
6. inner μ»¨ν…μŠ€νŠΈ 끝
7. outer μ»¨ν…μŠ€νŠΈ 재개
8. outer μ»¨ν…μŠ€νŠΈ 끝
9. μ „μ—­ μ»¨ν…μŠ€νŠΈ 재개
10. μ „μ—­μ»¨ν…μŠ€νŠΈ 끝
11. μ½”λ“œ μ’…λ£Œ

 

 

 

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ‹΄κΈ°λŠ” 정보

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—λŠ” μ•„λž˜μ™€ 같이 μ„Έ κ°€μ§€μ˜ 정보가 λ‹΄κΈ΄λ‹€.

 

VariableEnvironment

a. ν˜„μž¬ μ»¨ν…μŠ€νŠΈ λ‚΄μ˜ μ‹λ³„μž 정보 (ν˜Έμ΄μŠ€νŒ…μ— μ‚¬μš©λ¨)

b. μ™ΈλΆ€ ν™˜κ²½ 정보

c. μ„ μ–Έ μ‹œμ μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ μŠ€λƒ…μƒ·

 

LexicalEnvironment

VE의 μ„ μ–Έ μ‹œμ  μŠ€λƒ…μƒ·μ„ λ³΅μ‚¬ν•˜μ—¬ 생성! μŠ€λƒ…μƒ·μ΄ μœ μ§€λ˜μ§€ μ•Šκ³  변경사항이 μ‹€μ‹œκ°„μœΌλ‘œ λ°˜μ˜λœλ‹€.

 

this binding

this μ‹λ³„μžκ°€ 바라봐야 ν•  객체가 λ“€μ–΄μžˆλ‹€.

 

 

VE와 LE의 κ΅¬μ„±μš”μ†Œ

λ‘˜ λ‹€ λ™μΌν•˜κ²Œ environmentRecord (μ€„μ—¬μ„œ record) outerEnvironment (μ€„μ—¬μ„œ outer)둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

 

environmentRecord(= record)

ν˜„μž¬ μ»¨ν…μŠ€νŠΈμ™€ κ΄€λ ¨λœ μ‹λ³„μž 정보듀을 μˆ˜μ§‘ν•œλ‹€.

  • ν•¨μˆ˜μ— μ‹λ³„λœ λ§€κ°œλ³€μˆ˜ μ‹λ³„μž, ν•¨μˆ˜ 자체, var둜 μ„ μ–Έλœ λ³€μˆ˜ μ‹λ³„μž λ“±λ“±
  • μ»¨ν…μŠ€νŠΈ λ‚΄λΆ€λ₯Ό 처음-> 끝 μˆœμ„œλŒ€λ‘œ ν›‘μ–΄μ„œ μˆ˜μ§‘ν•œλ‹€.
  • μ΄λ ‡κ²Œ μˆ˜μ§‘λœ 정보듀은 ν˜Έμ΄μŠ€νŒ…μ— μ‚¬μš©λœλ‹€.
    λ³€μˆ˜μ˜ ν˜Έμ΄μŠ€νŒ…κ³Ό κ΄€λ ¨ν•΄μ„œλŠ” μ•„λž˜ ν¬μŠ€νŒ…μ—λ„ μ •λ¦¬ν–ˆλ‹€.
    https://i-ten.tistory.com/149

 

ν•¨μˆ˜μ˜ ν˜Έμ΄μŠ€νŒ… κ΄€λ ¨ν•΄μ„œλŠ” ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜ 뢀뢄이, ν•¨μˆ˜ 선언문은 κ·Έ 자체둜 ν˜Έμ΄μŠ€νŒ… λœλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€!

 

 

outerEnvironment(= outer)

outerλŠ” 선언될 λ‹Ήμ‹œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μ°Έμ‘°ν•΄μ„œ μŠ€μ½”ν”„ 체인이 κ°€λŠ₯토둝 ν•œλ‹€.

 

μŠ€μ½”ν”„ 체인?

μŠ€μ½”ν”„ 체인은 μ‹λ³„μžμ˜ 유효 λ²”μœ„λ₯Ό μ•ˆμ—μ„œλΆ€ν„° λ°”κΉ₯으둜 κ²€μƒ‰ν•΄λ‚˜κ°€λŠ” 것!..

var a = 1;
var outer = function(){
    var inner = function(){
        console.log(a);
        var a = 3;
    };
    inner();
    console.log(a);
};
outer();
console.log(a);

μœ„μ™€ 같은 μ½”λ“œκ°€ μžˆλ‹€κ³  ν•  λ•Œ, 이 μ½”λ“œμ˜ κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™λ‹€.

첫 번째 λ‘œκ·ΈλŠ” μ™œ undefinedμΈκ°€μš”?..

inner ν•¨μˆ˜ μ•ˆμ—μ„œ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ μ΄λ ‡κ²Œ μ§„ν–‰λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λ³€μˆ˜ aλŠ” μ„ μ–Έλ˜κΈ°λ§Œ ν•˜κ³  κ°’ 할당을 아직 받지 λͺ»ν–ˆκΈ° λ•Œλ¬Έμ— undefinedκ°€ λ‚˜μ˜¨λ‹€.

ν•˜μ§€λ§Œ a의 값은 inner ν•¨μˆ˜ μŠ€μ½”ν”„ μ•ˆμ—μ„œ 찾은 μƒνƒœ.

 

그럼 두 λ²ˆμ§Έμ™€ μ„Έ 번째 μ½˜μ†”μ€ μ™œ 1μΈκ°€μš”.. ν•œλ‹€λ©΄ inner ν•¨μˆ˜μ˜ 호좜이 λλ‚œ μƒνƒœμ΄κΈ° λ•Œλ¬Έμ— 콜 μŠ€νƒμ—λŠ” μ΄λ ‡κ²Œ λ‚¨λŠ”λ‹€.

outer ν•¨μˆ˜ 내뢀에 λ³€μˆ˜ aκ°€ μ—†κΈ° λ•Œλ¬Έμ— μŠ€μ½”ν”„ 체인을 톡해 μ „μ—­ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ μ°Ύμ•„μ˜¨ 것!

이런 μ‹μœΌλ‘œ 호좜된 μŠ€μ½”ν”„ μ•ˆμ—μ„œ 값을 찾지 λͺ»ν–ˆμ„ λ•Œ λ°”κΉ₯ μŠ€μ½”ν”„λ‘œ 거슬러 μ˜¬λΌκ°€λ©° 값을 μ°ΎλŠ” 것이 μŠ€μ½”ν”„ 체인이닀!

 

 

 

 

 

 

728x90