본문으둜 κ±΄λ„ˆλ›°κΈ°

5. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ ν΄λ‘œμ €

이 글은 κ³ ν˜„μ€€, μ†‘ν˜•μ£Ό λ‹˜μ˜ μΈμ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Όμ°Έμ‘°ν•˜μ—¬ μž‘μ„±ν•œ κΈ€μž…λ‹ˆλ‹€.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ κ°œλ…#

λ‹€λ₯Έ μ–Έμ–΄μ˜ 콜 μŠ€νƒ(call stack) κ°œλ…κ³Ό μœ μ‚¬ν•œ κ°œλ…

콜 μŠ€νƒ(call stack) : ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ ν•΄λ‹Ή ν•¨μˆ˜μ˜ 호좜 정보(ν•¨μˆ˜ λ‚΄ 지역 λ³€μˆ˜ν˜Ήμ€ μΈμžκ°’ λ“±)κ°€ μŒ“μ—¬μžˆλŠ” μŠ€νƒ

ECMAScriptμ—μ„œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό "μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό ν˜•μƒν™”ν•˜κ³  κ΅¬λΆ„ν•˜λŠ” 좔상적인 κ°œλ…" 으둜 κΈ°μˆ ν•˜κ³ , 이λ₯Ό 콜 μŠ€νƒκ³Ό 연관지어 μ •μ˜ν•˜λ©΄ "μ‹€ν–‰ κ°€λŠ₯ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ 블둝이 μ‹€ν–‰λ˜λŠ” ν™˜κ²½" 이라고 ν•  수 μžˆλ‹€.

μ—¬κΈ°μ„œ λ§ν•˜λŠ” μ½”λ“œ 블둝은 λŒ€λΆ€λΆ„μ˜ 경우 ν•¨μˆ˜μ΄λ‹€.

ECMAScriptμ—μ„œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ ν˜•μ„±λ˜λŠ” 경우λ₯Ό μ„Έ κ°€μ§€λ‘œ κ·œμ •ν•œλ‹€.

  • μ „μ—­ μ½”λ“œ

  • eval() ν•¨μˆ˜λ‘œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ

  • ν•¨μˆ˜ μ•ˆμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  경우


λŒ€λΆ€λΆ„ ν•¨μˆ˜λ‘œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό λ§Œλ“œλŠ”λ°, 이 μ½”λ“œ 블둝 μ•ˆμ— λ³€μˆ˜ 및 객체, μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œκ°€ λ“€μ–΄μžˆλ‹€. 이 μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³ , μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μŠ€νƒ μ•ˆμ— ν•˜λ‚˜μ”© 차곑차곑 μŒ“μ΄λ©° μ‹€ν–‰λœλ‹€.

ECMAScriptμ—μ„œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ 생성을 λ‹€μŒμ²˜λŸΌ μ„€λͺ…ν•œλ‹€.

"ν˜„μž¬ μ‹€ν–‰λ˜λŠ” μ»¨ν…μŠ€νŠΈμ—μ„œ 이 μ»¨ν…μŠ€νŠΈμ™€ κ΄€λ ¨ μ—†λŠ” μ‹€ν–‰ μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©΄, μƒˆλ‘œμš΄ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜μ–΄ μŠ€νƒμ— λ“€μ–΄κ°€κ³  μ œμ–΄κΆŒμ΄ κ·Έ μ»¨ν…μŠ€νŠΈλ‘œ μ΄λ™ν•œλ‹€."


var x = 'xxx';
function foo() {    var y = 'yyy';
    function bar() {        var z = 'zzz';        console.log(x + y + z);    }    bar();}foo();

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ 같이 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ(Stack)이 μƒμ„±ν•˜κ³  μ†Œλ©Έν•œλ‹€.

ν˜„μž¬ μ‹€ν–‰ 쀑인 μ»¨ν…μŠ€νŠΈμ—μ„œ 이 μ»¨ν…μŠ€νŠΈμ™€ κ΄€λ ¨μ—†λŠ” μ½”λ“œ(λ‹€λ₯Έ ν•¨μˆ˜ λ“±)κ°€ μ‹€ν–‰λ˜λ©΄μƒˆλ‘œμš΄ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  μŠ€νƒμ— μŒ“μ΄κ³  μ œμ–΄κΆŒμ΄ μ΄λ™ν•œλ‹€.


2020-03-08-5-μ‹€ν–‰-μ»¨ν…μŠ€νŠΈμ™€-ν΄λ‘œμ €-image-0

예제 및 κ·Έλ¦Ό 좜처 : μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μž‘ 원리 - Poiemaweb


  1. 컨트둀이 μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ‘œ μ΄λ™ν•˜λ©΄, 논리적 μŠ€νƒ ꡬ쑰λ₯Ό κ°€μ§€λŠ” μƒˆλ‘œμš΄ μ‹€ν–‰μ»¨ν…μŠ€νŠΈ μŠ€νƒμ΄ μƒμ„±λœλ‹€. μŠ€νƒμ€ LIFO(Last In First Out, ν›„μž… μ„ μΆœ)의 ꡬ쑰λ₯Όκ°€μ§€λŠ” λ‚˜μ—΄ ꡬ쑰이닀.

  2. μ „μ—­ μ½”λ“œ(Global code)둜 컨트둀이 μ§„μž…ν•˜λ©΄, μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ— μŒ“μΈλ‹€. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ’…λ£Œλ  λ•Œ(μ›ΉνŽ˜μ΄μ§€μ—μ„œ λ‚˜κ°€κ±°λ‚˜ λΈŒλΌμš°μ €λ₯Ό 닫을 λ•Œ)κΉŒμ§€ μœ μ§€λœλ‹€.

  3. ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜λ©° 직전에 μ‹€ν–‰λœ μ½”λ“œ λΈ”λ‘μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μœ„μ— μŒ“μΈλ‹€.

  4. ν•¨μˆ˜ 싀행이 λλ‚˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό νŒŒκΈ°ν•˜κ³  μ§μ „μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μ»¨νŠΈλ‘€μ„ λ°˜ν™˜ν•œλ‹€.


μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성 κ³Όμ •#

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λ©΄, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λœλ‹€. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λœ 이후에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ‹€μŒμ˜ 일을 μˆœμ„œλŒ€λ‘œ μ‹€ν–‰ν•œλ‹€.

  • ν™œμ„± 객체 생성

  • arguments 객체 생성

  • μŠ€μ½”ν”„ 정보 생성

  • λ³€μˆ˜ 생성

  • this 바인딩

  • μ½”λ“œ μ‹€ν–‰


ν™œμ„± 객체 생성#

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜λ©΄ ν•΄λ‹Ή μ»¨ν…μŠ€νŠΈ 싀행에 ν•„μš”ν•œ 정보λ₯Ό 담을 객체λ₯Ό μƒμ„±ν•œλ‹€. 이λ₯Ό ν™œμ„± 객체 λ˜λŠ” λ³€μˆ˜ 객체 라고 ν•œλ‹€. 이 객체에 λ³€μˆ˜, λ§€κ°œλ³€μˆ˜μ™€ 인수, ν•¨μˆ˜ μ„ μ–Έμ˜ 정보λ₯Ό λ‹΄λŠ”λ‹€.


arguments 객체 생성#

λ‹€μŒμœΌλ‘œλŠ” arguments 객체λ₯Ό μƒμ„±ν•œλ‹€. μ•žμ„œ λ§Œλ“€μ–΄μ§„ ν™œμ„± κ°μ²΄λŠ” arguments ν”„λ‘œνΌν‹°λ‘œ 이 arguments 객체λ₯Ό μ°Έμ‘°ν•œλ‹€.


μŠ€μ½”ν”„ 정보 생성#

λ‹€μŒμœΌλ‘œλŠ” μŠ€μ½”ν”„ 정보λ₯Ό μƒμ„±ν•œλ‹€. μŠ€μ½”ν”„ μ •λ³΄λŠ” ν˜„μž¬ μ»¨ν…μŠ€νŠΈμ˜ 유효 λ²”μœ„λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. μ΄λŠ” ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μ•ˆμ—μ„œ μ—°κ²° λ¦¬μŠ€νŠΈμ™€ μœ μ‚¬ν•œ ν˜•μ‹μœΌλ‘œλ§Œλ“€μ–΄μ§„λ‹€. 이 리슀트둜 ν˜„μž¬ μ»¨ν…μŠ€νŠΈλΆ€ν„° μƒμœ„ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ³€μˆ˜κΉŒμ§€ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.

μžμ„Έν•œ 과정은 μŠ€μ½”ν”„ μ²΄μ΄λ‹μ—μ„œ μ‚΄νŽ΄λ³Έλ‹€.


λ³€μˆ˜ 생성#

λ‹€μŒμœΌλ‘œ ν˜„μž¬ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ˜λŠ” 지역 λ³€μˆ˜κ°€ μƒμ„±λœλ‹€. λ³€μˆ˜ 객체 μ•ˆμ—μ„œ 호좜된 ν•¨μˆ˜ μΈμžλŠ” 각각의 ν”„λ‘œνΌν‹°κ°€ λ§Œλ“€μ–΄μ§€κ³  κ·Έ 값이 ν• λ‹Ήλœλ‹€. (값이 λ„˜κ²¨μ§€μ§€ μ•Šμ•˜λ‹€λ©΄ undefined κ°€ ν• λ‹Ήλœλ‹€)

λ³€μˆ˜λ‚˜ λ‚΄λΆ€ ν•¨μˆ˜μ˜ 경우 단지 λ©”λͺ¨λ¦¬μ— μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”λŠ” 각 λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” ν‘œν˜„μ‹μ΄ μ‹€ν–‰λ˜κΈ° μ „κΉŒμ§€λŠ” 이루어지지 μ•ŠλŠ”λ‹€. (ν•¨μˆ˜ μ„ μ–Έλ¬Έμ˜ 경우 ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚˜ ν•¨μˆ˜ 객체λ₯Ό μ¦‰μ‹œ ν• λ‹Ήν•œλ‹€.)

this 바인딩#

λ§ˆμ§€λ§‰ λ‹¨κ³„μ—μ„œλŠ” this ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 값이 ν• λ‹Ήλœλ‹€. 이 값에 μ–΄λ–€ 객체가 λ“€μ–΄κ°ˆμ§€λŠ” ν•¨μˆ˜ν˜ΈμΆœκ³Ό this λ°”μΈλ”©μ—μ„œ μ‚΄νŽ΄λ΄€μœΌλ‹ˆ μ°Έμ‘°ν•˜μž.


μ½”λ“œ μ‹€ν–‰#

μ΄λ ‡κ²Œ ν•˜λ‚˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  λ³€μˆ˜ 객체가 λ§Œλ“€μ–΄μ§„ 후에 μ½”λ“œμ— μžˆλŠ” ν‘œν˜„μ‹μ΄ μ‹€ν–‰λœλ‹€.


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

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜ λ‚΄μ˜ {} 블둝, 즉 for() {} , if() {} 와 같은 κ΅¬λ¬Έμ€μœ νš¨ λ²”μœ„κ°€ μ—†κ³ , 였직 ν•¨μˆ˜λ§Œμ΄ 유효 λ²”μœ„μ˜ ν•œ λ‹¨μœ„κ°€ λœλ‹€. (ES6μ—μ„œλŠ” let, constλ₯Ό 톡해 {} μ•ˆμ— 유효 λ²”μœ„λ₯Ό κ°–κ²Œ λ§Œλ“€ 수 μžˆλ‹€.)

이 유효 λ²”μœ„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μŠ€μ½”ν”„κ°€ [[scope]] ν”„λ‘œνΌν‹°λ‘œ 각 ν•¨μˆ˜ λ‚΄μ—μ„œ μ—°κ²° 리슀트 ν˜•μ‹μœΌλ‘œ κ΄€λ¦¬λ˜λŠ”λ°, 이λ₯Ό μŠ€μ½”ν”„ 체인이라고 ν•œλ‹€.

  • 각각의 ν•¨μˆ˜λŠ” [[scope]] ν”„λ‘œνΌν‹°λ‘œ μžμ‹ μ΄ μƒμ„±λœ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜μŠ€μ½”ν”„ 체인을 μ°Έμ‘°ν•œλ‹€.

  • ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” μˆœκ°„ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  이 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰λœ ν•¨μˆ˜μ˜ [[scope]] ν”„λ‘œνΌν‹°λ₯Ό 기반으둜 μƒˆλ‘œμš΄ μŠ€μ½”ν”„ 체인을 λ§Œλ“ λ‹€.


μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μŠ€μ½”ν”„ 체인#


var var1 = 1;var var2 = 2;console.log(var1); // 1console.log(var2); // 2

μ΄λŠ” μ „μ—­ μ½”λ“œμ΄λ‹€. 이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  λ³€μˆ˜ κ°μ²΄κ°€λ§Œλ“€μ–΄μ§„λ‹€. ν˜„μž¬ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 단 ν•˜λ‚˜λ§Œ μ‹€ν–‰λ˜κ³  μžˆμ–΄ μ°Έμ‘°ν•  μƒμœ„ μ»¨ν…μŠ€νŠΈκ°€ μ—†κ³  λ”°λΌμ„œ 이 λ³€μˆ˜ 객체의 μŠ€μ½”ν”„ 체인은 자기 μžμ‹ λ§Œμ„ 가진닀. 즉 λ³€μˆ˜ 객체의 [[scope]] ν”„λ‘œνΌν‹°λŠ” λ³€μˆ˜ 객체 μžμ‹ μ„ 가리킨닀.


2020-03-08-5-μ‹€ν–‰-μ»¨ν…μŠ€νŠΈμ™€-ν΄λ‘œμ €-image-1


ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 경우 μƒμ„±λ˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μŠ€μ½”ν”„ 체인#


var var1 = 1;var var2 = 2;
function func() {    var var1 = 10;    var var2 = 20;    console.log(var1); // 10    console.log(var2); // 20}
func();
console.log(var1); // 1console.log(var2); // 2

이 예제λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  func() ν•¨μˆ˜ 객체가 λ§Œλ“€μ–΄μ§„λ‹€ . 이 ν•¨μˆ˜ 객체의 [[scope]] λŠ” μ–΄λ–»κ²Œ 될까? ν•¨μˆ˜ 객체가 생성될 λ•Œ, κ·Έ ν•¨μˆ˜ 객체의 [[scope]] λŠ” ν˜„μž¬ μ‹€ν–‰λ˜λŠ” μ»¨ν…μŠ€νŠΈμ˜ λ³€μˆ˜ 객체에 μžˆλŠ” [[scope]] λ₯Ό κ·ΈλŒ€λ‘œ 가진닀. λ”°λΌμ„œ func ν•¨μˆ˜ 객체의 [[scope]] λŠ” μ „μ—­ λ³€μˆ˜ 객체가 λœλ‹€.

그리고 func() ν•¨μˆ˜κ°€ 싀행될 λ•Œ, μƒˆλ‘œμš΄ μ»¨ν…μŠ€νŠΈ( func μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ)κ°€ μƒμ„±λœλ‹€. 이 func μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μŠ€μ½”ν”„ 체인은 μ‹€ν–‰λœ ν•¨μˆ˜μ˜ [[scope]] ν”„λ‘œνΌν‹°λ₯Ό κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•œ ν›„, ν˜„μž¬ μƒμ„±λœ λ³€μˆ˜ 객체λ₯Ό λ³΅μ‚¬ν•œ μŠ€μ½”ν”„ 체인의 맨 μ•žμ— μΆ”κ°€ν•œλ‹€.


2020-03-08-5-μ‹€ν–‰-μ»¨ν…μŠ€νŠΈμ™€-ν΄λ‘œμ €-image-2


예제 1#


var value = 'value1';
function printFunc() {    var value = 'value2';
    function printValue() {        return value;    }
    console.log(printValue());}
printFunc();

[좜λ ₯ κ²°κ³Ό]

value2

2020-03-08-5-μ‹€ν–‰-μ»¨ν…μŠ€νŠΈμ™€-ν΄λ‘œμ €-image-3


예제 2#


var value = 'value1';
function printValue() {    return value;}
function printFunc(func) {    var value = 'value2';    console.log(func());}
printFunc(printValue);

[좜λ ₯ κ²°κ³Ό]

value1

2020-03-08-5-μ‹€ν–‰-μ»¨ν…μŠ€νŠΈμ™€-ν΄λ‘œμ €-image-4


μœ„ 두 μ˜ˆμ œλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν•‘(Lexical scoping)을 μ΄ν•΄ν•˜λŠ”λ° μ€‘μš”ν•œ μ˜ˆμ œμ΄λ‹€. - πŸ”— ν•¨μˆ˜μ˜ λ²”μœ„(scope) - ZeroCho


ν΄λ‘œμ €#

ν΄λ‘œμ €μ˜ κ°œλ…#


function outerFunc() {    var x = 10;    var innerFunc = function () {        console.log(x);    };    return innerFunc;}
var inner = outerFunc();inner(); // 10

2020-03-08-5-μ‹€ν–‰-μ»¨ν…μŠ€νŠΈμ™€-ν΄λ‘œμ €-image-5


μ˜ˆμ œμ—μ„œ innerFunc() λŠ” outerFunc() 의 싀행이 λλ‚œ ν›„ μ‹€ν–‰λœλ‹€. outerFunc() 의 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 사라진 이후에 innerFunc μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜λŠ” 것이닀. 그러면 innerFunc() 의 μŠ€μ½”ν”„ 체인은 outerFunc λ³€μˆ˜ 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆμ„κΉŒ?

이것을 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 것이 ν΄λ‘œμ €(Closure) λΌλŠ” κ°œλ…μ΄λ‹€. outerFunc 의 μ‹€ν–‰μ»¨ν…μŠ€νŠΈκ°€ 사라지더라도 outerFunc λ³€μˆ˜ κ°μ²΄λŠ” μ—¬μ „νžˆ λ‚¨μ•„μžˆλ‹€.

μ—¬κΈ°μ„œ μ΅œμ’… λ°˜ν™˜λ˜λŠ” ν•¨μˆ˜ innerFunc κ°€ μ™ΈλΆ€ ν•¨μˆ˜ outerFunc 의 μ§€μ—­λ³€μˆ˜ x 에 μ ‘κ·Όν•˜κ³  μžˆλ‹€λŠ” 것이 μ€‘μš”ν•˜λ‹€. 이 지역 λ³€μˆ˜μ— μ ‘κ·Όν•˜λ €λ©΄, ν•¨μˆ˜κ°€ μ’…λ£Œλ˜μ–΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ λ°˜ν™˜λ˜λ”λΌλ„, λ³€μˆ˜ κ°μ²΄λŠ” λ°˜ν™˜λ˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜μ˜ μŠ€μ½”ν”„ 체인에 κ·ΈλŒ€λ‘œ λ‚¨μ•„μžˆμ–΄μ•Όλ§Œ μ ‘κ·Όν•  수 μžˆλ‹€.

이처럼 이미 생λͺ… μ£ΌκΈ°κ°€ λλ‚œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €λΌκ³ ν•œλ‹€. λ”°λΌμ„œ innerFunc() λ₯Ό ν΄λ‘œμ €λΌκ³  ν•˜κ³ , ν΄λ‘œμ €λ‘œ μ°Έμ‘°λ˜λŠ” μ™ΈλΆ€ λ³€μˆ˜ x λ₯Ό 자유 λ³€μˆ˜ 라고 ν•œλ‹€.


참고자료#

πŸ”— ν•¨μˆ˜μ˜ λ²”μœ„(scope) - ZeroCho

πŸ”— μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μž‘ 원리 - Poiemaweb