μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ(Execution Context)

  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλž€ μ‹€ν–‰ν•  μ½”λ“œμ— μ œκ³΅ν•  ν™˜κ²½ 정보듀을 λͺ¨μ•„놓은 κ°μ²΄μž…λ‹ˆλ‹€.
  • λ™μΌν•œ ν™˜κ²½μ— μžˆλŠ” μ½”λ“œλ“€μ„ μ‹€ν–‰ν•  λ•Œ ν•„μš”ν•œ ν™˜κ²½ 정보듀을 λͺ¨μ•„ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜κ³  이λ₯Ό μ½œμŠ€νƒμ— μŒ“μ•„ μ˜¬λ¦½λ‹ˆλ‹€.
  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” 전역곡간이 생성될 λ•Œ, ν•¨μˆ˜κ°€ 호좜될 λ•Œ μƒμ„±λ©λ‹ˆλ‹€.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ 콜 μŠ€νƒ 예제

μ½”λ“œ μ‹€ν–‰μ‹œ, 전역곡간이 ν™œμ„±ν™”λ˜λ©΄μ„œ μ „μ—­ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  ν•¨μˆ˜ 호좜 μˆœμ„œλŒ€λ‘œ μ½œμŠ€νƒμ— μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μŒ“μ΄λŠ”κ²ƒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ λ‹΄κ³  μžˆλŠ” 정보

  • Variable Environment
    • environmentRecord (snapshot) : ν˜„μž¬ μ»¨ν…μŠ€νŠΈ λ‚΄μ˜ μ‹λ³„μžλ“€μ— λŒ€ν•œ 정보
    • outerEnvironmentReference (snapshot) : μ™ΈλΆ€ ν™˜κ²½ 정보
  • Lexical Environment
    • environmentRecord : ν˜„μž¬ μ»¨ν…μŠ€νŠΈ λ‚΄μ˜ μ‹λ³„μžλ“€μ— λŒ€ν•œ 정보
    • outerEnvironmentReference : μ™ΈλΆ€ ν™˜κ²½ 정보
    • Variable Environment와 λ™μΌν•˜μ§€λ§Œ 변경사항이 μ‹€μ‹œκ°„μœΌλ‘œ 반영됨
  • Variable Environment에 정보λ₯Ό λ¨Όμ € λ‹΄κ³ , 이λ₯Ό κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•΄μ„œ Lexical Environmentλ₯Ό λ§Œλ“€κ³  이후 Lexical Environmentλ₯Ό 주둜 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • ThisBinding : μ‹λ³„μžκ°€ 바라봐야 ν•  λŒ€μƒ 객체

environmentRecord

  • λ§€κ°œλ³€μˆ˜λͺ…, μ„ μ–Έλœ ν•¨μˆ˜ 자체, λ³€μˆ˜λͺ… 등이 λ‹΄κΉλ‹ˆλ‹€.
  • μ»¨ν…μŠ€νŠΈ λ‚΄λΆ€λ₯Ό μ²˜μŒλΆ€ν„° λκΉŒμ§€ νƒμƒ‰ν•˜λ©° μˆœμ„œλŒ€λ‘œ μˆ˜μ§‘ν•©λ‹ˆλ‹€.

ν˜Έμ΄μŠ€νŒ…(Hoisting)

  • ν˜Έμ΄μŠ€νŒ…μ€ μ‹λ³„μžλ“€μ€ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” 것을 λœ»ν•©λ‹ˆλ‹€.
  • μ‹λ³„μžλ§Œ λŒμ–΄μ˜¬λ¦¬κ³  ν• λ‹Ή 과정은 κ·ΈλŒ€λ‘œ λ‚¨κ²¨λ‘‘λ‹ˆλ‹€.
  • νŽΈμ˜μƒ λŒμ–΄μ˜¬λ¦¬λŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•˜λŠ” κ°€μƒμ˜ κ°œλ…μ΄λ©° μ‹€μ œλ‘œ λŒμ–΄μ˜¬λ¦¬μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
  • -> 이 과정을 마치면 μ½”λ“œ μ‹€ν–‰ 전에도 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ³€μˆ˜λͺ…듀을 λͺ¨λ‘ μ•Œκ³  있게 λ©λ‹ˆλ‹€.

ν•¨μˆ˜ μ„ μ–Έλ¬Έ(Function Declarations)

일반적인 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œμ˜ ν•¨μˆ˜ μ„ μ–Έκ³Ό λΉ„μŠ·ν•œ ν˜•μ‹μž…λ‹ˆλ‹€.


function ν•¨μˆ˜λͺ…() {  
  κ΅¬ν˜„ 둜직  
}

// μ˜ˆμ‹œ  
function funcDeclarations() {  
  return 'A function declaration';  
}  
funcDeclarations(); // 'A function declaration'

ν•¨μˆ˜ ν‘œν˜„μ‹(Function Expressions)

var ν•¨μˆ˜λͺ… = function () {  
  κ΅¬ν˜„ 둜직  
};
// μ˜ˆμ‹œ  
var funcExpression = function () {  
    return 'A function expression';  
}  
funcExpression(); // 'A function expression'

ν•¨μˆ˜ 선언식과 ν‘œν˜„μ‹μ˜ 차이점

ν•¨μˆ˜ 선언식은 ν˜Έμ΄μŠ€νŒ…μ— 영ν–₯을 λ°›μ§€λ§Œ, ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν˜Έμ΄μŠ€νŒ…μ— 영ν–₯을 받지 μ•ŠμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ 선언식은 μ½”λ“œλ₯Ό κ΅¬ν˜„ν•œ μœ„μΉ˜μ™€ 관계없이 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŠΉμ§•μΈ ν˜Έμ΄μŠ€νŒ…μ— 따라 λΈŒλΌμš°μ €κ°€ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 해석할 λ•Œ 맨 μœ„λ‘œ λŒμ–΄ μ˜¬λ €μ§‘λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μ•„λž˜μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ

// μ‹€ν–‰ μ „
logMessage();
sumNumbers();

function logMessage() {
  return 'worked';
}

var sumNumbers = function () {
  return 10 + 20;
};

ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈ ν•΄μ„κΈ°λŠ” μ½”λ“œλ₯Ό μ•„λž˜μ™€ 같이 μΈμ‹ν•©λ‹ˆλ‹€.

// μ‹€ν–‰ μ‹œ
function logMessage() {
  return 'worked';
}

var sumNumbers;

logMessage(); // 'worked'
sumNumbers(); // Uncaught TypeError: sumNumbers is not a function

sumNumbers = function () {
  return 10 + 20;
};

μœ„ μ½”λ“œ κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹ sumNumbers μ—μ„œ var 도 ν˜Έμ΄μŠ€νŒ…μ΄ μ μš©λ˜μ–΄ μœ„μΉ˜κ°€ μƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ €μ§‘λ‹ˆλ‹€.

var sumNumbers;
logMessage();
sumNumbers();
JsCopy

ν•˜μ§€λ§Œ μ‹€μ œ sumNumbers 에 할당될 function λ‘œμ§μ€ 호좜된 이후에 μ„ μ–Έλ˜λ―€λ‘œ, sumNumbers λŠ” ν•¨μˆ˜λ‘œ μΈμ‹ν•˜μ§€ μ•Šκ³  λ³€μˆ˜λ‘œ μΈμ‹ν•©λ‹ˆλ‹€.
ν˜Έμ΄μŠ€νŒ…μ„ μ œλŒ€λ‘œ λͺ¨λ₯΄λ”라도 ν•¨μˆ˜μ™€ λ³€μˆ˜λ₯Ό 가급적 μ½”λ“œ μƒλ‹¨λΆ€μ—μ„œ μ„ μ–Έν•˜λ©΄, ν˜Έμ΄μŠ€νŒ…μœΌλ‘œ μΈν•œ μŠ€μ½”ν”„ κΌ¬μž„ ν˜„μƒμ€ 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

References

 

ν•¨μˆ˜ ν‘œν˜„μ‹ vs ν•¨μˆ˜ 선언식

(κΈ°λ³Έ) μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜ ν‘œν˜„μ‹κ³Ό ν•¨μˆ˜ μ„ μ–Έμ‹μ—λŠ” μ–΄λ– ν•œ 차이점이 μžˆλŠ”μ§€ μ•Œμ•„λ΄…λ‹ˆλ‹€.

joshua1988.github.io

'πŸ”₯ Front-End > JavaScript' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[JS] ES6  (0) 2022.07.24
[JS] TDZ  (0) 2022.07.21
[JS] ν΄λ‘œμ €(Closure)  (0) 2022.07.21
[JS] μŠ€μ½”ν”„(Scope)  (0) 2022.07.21
[JS] JavaScript 객체와 λΆˆλ³€μ„±  (0) 2022.07.20
λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€!