πŸ“š Study Note/JavaScript

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive - μŠ€μ½”ν”„

Jellll_y 2022. 12. 8. 17:04

μŠ€μ½”ν”„

μŠ€μ½”ν”„λž€ μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λ₯Ό λœ»ν•œλ‹€.

μ—¬κΈ°μ„œ μ‹λ³„μžλŠ” λ³€μˆ˜, ν•¨μˆ˜, 클래슀 이름 등을 뜻 ν•œλ‹€. 

 

μš°μ„  μŠ€μ½”ν”„λŠ” μ„ μ–Έλœ μœ„μΉ˜μ— 따라 크게 μ§€μ—­ μŠ€μ½”ν”„, μ „μ—­ μŠ€μ½”ν”„λ‘œ λ‚˜λ‰œλ‹€.

 

μ§€μ—­ μŠ€μ½”ν”„

μ§€μ—­μ΄λž€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ₯Ό λœ»ν•œλ‹€.

κ·ΈλŸ¬λ―€λ‘œ ν•¨μˆ˜ λ‚΄λΆ€ λ˜λŠ” 블둝 λ‚΄λΆ€μ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ μ§€μ—­ μŠ€μ½”ν”„λ₯Ό κ°€μ§€λŠ” μ§€μ—­ λ³€μˆ˜κ°€ 되며

μ§€μ—­ λ³€μˆ˜λŠ” μžμ‹ μ˜ μ§€μ—­ μŠ€μ½”ν”„μ™€ ν•˜μœ„ μ§€μ—­ μŠ€μ½”ν”„μ—μ„œλ§Œ μ°Έμ‘° κ°€λŠ₯ν•˜λ‹€.

 

μ „μ—­ μŠ€μ½”ν”„

μ „μ—­μ΄λž€ μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯μͺ½ μ˜μ—­μ„ λ§ν•œλ‹€.

κ·ΈλŸ¬λ―€λ‘œ 전역에 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ μ „μ—­ μŠ€μ½”ν”„λ₯Ό κ°€μ§€λŠ” μ „μ—­ λ³€μˆ˜κ°€ 되며

μ „μ—­ λ³€μˆ˜λŠ” μ–΄λ””μ„œλ“  μ°Έμ‘° κ°€λŠ₯ν•˜λ‹€.

 

var x = 'global' // μ „μ—­ μŠ€μ½”ν”„, μ „μ—­ λ³€μˆ˜

function outer(){ // μ§€μ—­ μŠ€μ½”ν”„ 
	var z = 'local' // μ§€μ—­ λ³€μˆ˜
    
    function inner(){ // μ§€μ—­ μŠ€μ½”ν”„
    	var q = 'local' // μ§€μ—­ λ³€μˆ˜
        console.log(x)
      	console.log(z)
    }
}

console.log(z)

inner ν•¨μˆ˜ μ•ˆμ—μ„œμ˜ 

λ³€μˆ˜ xλŠ” μ „μ—­ λ³€μˆ˜λ‘œ λͺ¨λ“ κ³³μ—μ„œ μ°Έμ‘°ν•  수 있고,

λ³€μˆ˜ zλŠ” μ§€μ—­ λ³€μˆ˜λ‘œ ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œλ„ μ°Έμ‘° κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 

console.log(x), console.log(z)λŠ” 'global', 'local'을 μ •μƒμ μœΌλ‘œ 좜λ ₯ν•œλ‹€.

ν•˜μ§€λ§Œ

λ³€μˆ˜ z의 μœ νš¨ν•œ μŠ€μ½”ν”„ λ²”μœ„λŠ” μžμ‹ μ΄ μ†ν•œ outer ν•¨μˆ˜μ™€ λ‚΄λΆ€ μ§€μ—­ μŠ€μ½”ν”„κΉŒμ§€λ§Œ μœ νš¨ν•˜κΈ° λ•Œλ¬Έμ—

μ „μ—­μ—μ„œ console.log(z)λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. 

 

μŠ€μ½”ν”„ 체인

μŠ€μ½”ν”„ μ²΄μΈμ΄λž€ μŠ€μ½”ν”„κ°€ κ³„μΈ΅μ μœΌλ‘œ μ—°κ²°λœ 것을 λ§ν•œλ‹€.

 

μœ„μ˜ 그림을 μ˜ˆμ‹œλ‘œ λ“€λ©΄ 

 

λ‹€μŒκ³Ό 같은 μŠ€μ½”ν”„ 체인을 κ°€μ§„λ‹€. 

 

μ „μ—­ μŠ€μ½”ν”„
x 'global'
outer <function object>

outer μ§€μ—­ μŠ€μ½”ν”„
z 'local'
inner <function object>

inner μ§€μ—­ μŠ€μ½”ν”„
q 'local'

 

μœ„μ˜ 예제처럼 ν•¨μˆ˜μ˜ 쀑첩이 λ°œμƒν•˜λ©΄ μŠ€μ½”ν”„ λ˜ν•œ 쀑첩에 μ˜ν•œ 계측 ꡬ쑰λ₯Ό κ°€μ§„λ‹€.

그리고 λͺ¨λ“  μ§€μ—­ μŠ€μ½”ν”„μ˜ μ΅œμƒμœ„ μŠ€μ½”ν”„λŠ” μ „μ—­ μŠ€μ½”ν”„μ΄λ‹€.

 

μŠ€μ½”ν”„ μ²΄μΈμ—μ„œ μ‹λ³„μž μ°ΎκΈ° 

μš°μ„  μŠ€μ½”ν”„ 체인은 계측 ꡬ쑰λ₯Ό κ°€μ§€λ©° 

μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λŠ” ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ 자유둭게 μ°Έμ‘° κ°€λŠ₯ν•˜μ§€λ§Œ

ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λ₯Ό μƒμœ„ μŠ€μ½”ν”„μ—μ„œλŠ” μ°Έμ‘° λΆˆκ°€λŠ₯ ν•˜λ‹€.

즉 μŠ€μ½”ν”„ 체인을 톡해 μ‹λ³„μžλ₯Ό 찾을 λ•Œμ—λŠ” ν˜„μž¬ μžμ‹ μ˜ μŠ€μ½”ν”„μ—μ„œ λ¨Όμ € μ‹λ³„μžλ₯Ό μ°Ύκ³ 

μ—†μœΌλ©΄ κ³„μ†ν•΄μ„œ μƒμœ„ μŠ€μ½”ν”„λ‘œ μ˜¬λΌκ°€λ©΄μ„œ μ‹λ³„μžλ₯Ό μ°ΎλŠ”λ‹€. 

 

ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„ κ²°μ • 

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•˜λŠ” 방법은 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(정적 μŠ€μ½”ν”„)λ₯Ό λ”°λ₯Έλ‹€.

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λž€ ν•¨μˆ˜κ°€ μ •μ˜λ  λ•Œ μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ”μ§€μ— 따라 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•˜λŠ” 것을 λ§ν•œλ‹€.

var x = 'global'

function foo(){
	var x = 'local'
    bar()
}

function bar(){
	console.log(x)
}

foo()
bar()

μœ„μ˜ 예제λ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ 닡은 'global' 두 번 좜λ ₯λœλ‹€.

μ΄μœ λŠ” bar의 μƒμœ„ μŠ€μ½”ν”„λŠ” fooν•¨μˆ˜μ—μ„œ barκ°€ 호좜될 λ•Œ κ²°μ •λ˜λŠ” 게 μ•„λ‹ˆλΌ

bar ν•¨μˆ˜κ°€ μ •μ˜λ  λ•Œ μƒμœ„ μŠ€μ½”ν”„κ°€ κ²°μ •λ˜λ©° 

barν•¨μˆ˜μ—μ„œ 좜λ ₯ν•˜κ³ μž ν•˜λŠ” λ³€μˆ˜ xλŠ” μ „μ—­μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜ x 이기 λ•Œλ¬Έμ΄λ‹€.