CodeStates/learning contents

Unit 9. [JS]ν΄λ‘œμ €

Jieunny 2022. 12. 23. 09:49

πŸ“£  ν΄λ‘œμ € ν•¨μˆ˜

βœ”οΈ ν™”μ‚΄ν‘œ ν•¨μˆ˜

const add = (x, y) => x + y;
add(5, 7)	// 12

 

βœ”οΈ ν™”μ‚΄ν‘œλ₯Ό 두 번 μ‚¬μš©

const adder = x => y => x + y;
adder(5)(7);	// 12

typeof adder(5)	// 'function'

adder(5)	//	y => x + y μ–˜ μžμ²΄κ°€ λ¦¬ν„΄κ°’μž„.
ν•¨μˆ˜μ˜ 호좜이 두 번 λ°œμƒν•œλ‹€. 
adder(5)의 리턴 값이 ν•¨μˆ˜μž„μ„ 의미 -> (y => x + y) μžμ²΄κ°€ adder(5)의 리턴값이닀.

 

βœ”οΈ ν΄λ‘œμ € ν•¨μˆ˜μ˜ κΈ°λ³Έ ν˜•νƒœ

const adder = function(x) {
	return function(y) {
    		return x + y;
    	}
}
1️⃣ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜
2️⃣ ν΄λ‘œμ €μ˜ 핡심은 'μŠ€μ½”ν”„λ₯Ό μ΄μš©ν•΄μ„œ λ³€μˆ˜μ˜ 접근을 λ‹«λŠ”(closure) 데'에 μžˆλ‹€.
➰ λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜μ— μ˜ν•΄ μŠ€μ½”ν”„κ°€ κ΅¬λΆ„λœλ‹€.
➰ μœ„ μ˜ˆμ‹œμ—μ„œ xκ°€ μ„ μ–Έλœ ν•¨μˆ˜λŠ” 'μ™ΈλΆ€ ν•¨μˆ˜', yκ°€ μ„ μ–Έλœ ν•¨μˆ˜λŠ” 'λ‚΄λΆ€ ν•¨μˆ˜'라고 λΆ€λ₯Έλ‹€.
=> 이 ν΄λ‘œμ € ν•¨μˆ˜λŠ” μŠ€μ½”ν”„κ°€ λΆ„λ¦¬λ˜μ–΄ μžˆλ‹€λŠ” 의미.
🚨 λ‚΄λΆ€ ν•¨μˆ˜μ— μ„ μ–Έλœ λ³€μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜κ°€ μ‚¬μš©ν•  수 μ—†λ‹€.
🚨 3️⃣ μ™ΈλΆ€ ν•¨μˆ˜μ— μ„ μ–Έλœ λ³€μˆ˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜κ°€ μ‚¬μš©ν•  수 μžˆλ‹€.

 

πŸ“£  ν΄λ‘œμ €μ˜ ν™œμš©

βœ”οΈ μ™ΈλΆ€ ν•¨μˆ˜μ˜ 싀행이 λλ‚˜λ”λΌλ„, μ™ΈλΆ€ ν•¨μˆ˜ λ‚΄ λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬ 상에 μ €μž₯λœλ‹€.

const adder = function(x) {
	return function(y) {
    		return x + y;
    	}
}
const add5 = adder(5);	// y => x + y μ—¬κΈ°μ„œ x에 5λΌλŠ” 값이 λ‹΄κ²¨μžˆμŒ.
add5(7)	// 12	y에 7μ΄λΌλŠ” 값을 λ„£μŒ.
add5(10)	// 15
λ³€μˆ˜ add5 μ—λŠ” ν΄λ‘œμ €λ₯Ό 톡해 λ¦¬ν„΄ν•œ ν•¨μˆ˜κ°€ 담겨 μžˆλ‹€.
add5 λŠ” adder ν•¨μˆ˜μ—μ„œ 인자둜 λ„˜κΈ΄ 5λΌλŠ” 값을 x λ³€μˆ˜μ— 계속 λ‹΄κ³ μžˆλ‹€. (μ™ΈλΆ€ ν•¨μˆ˜μ˜ 싀행이 λλ‚¬λŠ”λ°λ„)
μ™ΈλΆ€ ν•¨μˆ˜ 싀행은 이미 λλ‚¬μ§€λ§Œ, add5(7) 처럼 x=5 λΌλŠ” 값은 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. 

 

βœ”οΈ ν΄λ‘œμ €λ‘œ HTML λ¬Έμžμ—΄ λ§Œλ“€κΈ°

const tagMaker = tag => content => `<${tag}>${content}</${tag}>`

const divMaker = tagMaker('div');
divMaker('hello');	// '<div>hello</div>' μ™ΈλΆ€ ν•¨μˆ˜κ°€ λλ‚˜λ„ tagλŠ” 계속 divλ₯Ό λ‹΄κ³  있고 μ‚¬μš©κ°€λŠ₯함.
divMaker('codestates');	// '<div>codestates</div>'

const anchoMaker = tagMaker('a');
anchoMaker('go');	// '<a>go</a>'
anchorMaker('urclass');	// '<a>urclass</a>'
νŠΉμ • 데이터λ₯Ό μŠ€μ½”ν”„ μ•ˆμ— 가두어 λ‘” μ±„λ‘œ 계속 μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.

 

βœ”οΈ ν΄λ‘œμ € λͺ¨λ“ˆ νŒ¨ν„΄

βœ”οΈ λͺ¨λ“ˆν™” : ν•¨μˆ˜μ˜ μž¬μ‚¬μš©μ„±μ„ κ·ΉλŒ€ν™”ν•˜μ—¬ ν•¨μˆ˜ ν•˜λ‚˜λ₯Ό μ™„μ „νžˆ 독립적인 λΆ€ν’ˆ ν˜•νƒœλ‘œ λΆ„λ¦¬ν•˜λŠ” 것.

const makeCounter = () => {
	let value = 0;
    
    return {
    	increase: () => {
        	value = value + 1
        },
        decrease: () => {
       		value = value - 1
        },
        getValue: () => value
        }
    }
    const counter1 = makeCounter();
    
    counter1.increase();
    counter1.decrease();
    counter1.getValue();	// 0
    
    const counter2 = makeCounter();
    counter2.decrease();
    counter2.decrease();
    counter2.getValue();	// -2
λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό 객체에 λ‹΄μ•„ μ—¬λŸ¬ 개의 λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λ„λ‘ λ§Œλ“ λ‹€.
counter1 은 { increase: f, decrease: f, getValue: f } 객체이닀.

🚨 μ–΄λ–€ κ²½μš°μ—λ„ value λŠ” 직접 μˆ˜μ •μ΄ λΆˆκ°€λŠ₯ ν•˜λ‹€ -> μ™ΈλΆ€ μŠ€μ½”ν”„μ—μ„œλŠ” λ‚΄λΆ€ μŠ€μ½”ν”„μ˜ λ³€μˆ˜μ— μ ‘κ·Ό ν•  수 μ—†κΈ° λ•Œλ¬Έ
➰ λŒ€μ‹ , λ¦¬ν„΄ν•˜λŠ” 객체가 μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œλ₯Ό 톡해 value 값을 κ°„μ ‘μ μœΌλ‘œ μ‘°μž‘ ν•  수 μžˆλ‹€. -> μ •λ³΄μ˜ μ ‘κ·Ό μ œν•œ(μΊ‘μŠν™”)

λ§Œμ•½ μŠ€μ½”ν”„λ‘œ valueλ₯Ό 감싸지 μ•Šμ•˜λ‹€λ©΄ valueλ₯Ό 닀루기 μœ„ν•΄μ„œλŠ” value의 값이 μ „μ—­ λ³€μˆ˜μ—¬μ•Ό ν–ˆμ„ 것이닀.
ν΄λ‘œμ €λ‘œ λΆˆν•„μš”ν•œ μ „μ—­ λ³€μˆ˜ μ‚¬μš©μ„ 쀄이고 , 값을 μ•ˆμ „ν•˜κ²Œ λ‹€λ£° 수 μžˆλ‹€.

counter1κ³Ό counter2μ—μ„œ valueλŠ” 각각 λ…λ¦½μ μ΄λΌμ„œ μ„œλ‘œμ—κ²Œ 영ν–₯을 λΌμΉ˜μ§€ μ•ŠλŠ”λ‹€.