πŸ“ŒLanguage/JavaScript

TIL) μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λ‘œμ € κ°œλ…κ³Ό νŠΉμ§•

hellohailie 2022. 5. 14. 00:59

[λͺ©ν‘œ]

ν΄λ‘œμ € ν•¨μˆ˜μ˜ μ •μ˜μ™€ νŠΉμ§•μ— λŒ€ν•΄μ„œ 이해할 수 μžˆλ‹€.
ν΄λ‘œμ €κ°€ κ°–λŠ” μŠ€μ½”ν”„ λ²”μœ„λ₯Ό 이해할 수 μžˆλ‹€.
ν΄λ‘œμ €λ₯Ό μ΄μš©ν•΄ μœ μš©ν•˜κ²Œ μ“°μ΄λŠ” λͺ‡ 가지 νŒ¨ν„΄μ„ 이해할 수 μžˆλ‹€.

 

 

[μ°Έκ³ ]

ν΄λ‘œμ € κ³΅λΆ€ν•˜κΈ° μ „ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ•Œμ•„λ³΄μž!

 

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 읡λͺ… ν•¨μˆ˜λ‘œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. λ”°λΌμ„œ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•œλ‹€.

const pow = x => x * x;
console.log(pow(10)); // 100

 

 

ν΄λ‘œμ €λž€?

ν•¨μˆ˜μ™€ ν•¨μˆ˜κ°€ μ„ μ–Έλœ μ–΄νœ˜μ  ν™˜κ²½μ˜ μ‘°ν•©

λ°˜ν™˜λœ λ‚΄λΆ€ν•¨μˆ˜κ°€ μžμ‹ μ΄ 선언됐을 λ•Œμ˜ ν™˜κ²½μΈ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•˜μ—¬ μžμ‹ μ΄ 선언됐을 λ•Œμ˜ ν™˜κ²½(μŠ€μ½”ν”„) λ°–μ—μ„œ ν˜ΈμΆœλ˜μ–΄λ„ κ·Έ ν™˜κ²½(μŠ€μ½”ν”„)에 μ ‘κ·Όν•  수 μžˆλŠ” ν•¨μˆ˜

 

ν΄λ‘œμ € νŠΉμ§•κ³Ό μ˜ˆμ‹œ

 

🐜 νŠΉμ§• 1. ν•¨μˆ˜μ˜ 호좜이 두 번 λ°œμƒ

 

βœ”οΈ ν•¨μˆ˜μ˜ 호좜이 두 번 λ°œμƒν•˜λŠ” ν™”μ‚΄ν‘œ ν•¨μˆ˜ // ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό 두 번 μ‚¬μš©ν•œ λ§μ…ˆ ν•¨μˆ˜

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

 

 

βœ”οΈ 일반적인 ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ κ°„λ‹¨ν•œ λ§μ…ˆ ν•¨μˆ˜

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

 

 

 

🐜 νŠΉμ§•2. ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ // 리턴값이 ν•¨μˆ˜λ‹€. 

 

βœ”οΈ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜1 // 리턴값이 ν•¨μˆ˜

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

typeof adder(5) // 'function' (리턴값이 ν•¨μˆ˜ ν˜•νƒœ)

adder(5) // y => x + y (리턴값이 ν•¨μˆ˜ ν˜•νƒœ)

 

βœ”οΈ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜2 // 리턴값이 ν•¨μˆ˜

const adder = function (x) {
	return function (y) {
    	return x + y;
    }
}

 

 

 

🐜 νŠΉμ§•3. λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜μ— μ˜ν•΄ μŠ€μ½”ν”„(λ³€μˆ˜μ˜ μ ‘κ·Ό λ²”μœ„)κ°€ κ΅¬λΆ„λœλ‹€.

🐜 νŠΉμ§•4. λ‚΄λΆ€ ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ— μ„ μ–Έλœ λ³€μˆ˜μ— μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€. 

 

βœ”οΈ μ™ΈλΆ€ ν•¨μˆ˜μ™€ λ‚΄λΆ€ ν•¨μˆ˜

const adder = function (x) {
	return function (y) {
    	return x + y;
    }
}

xκ°€ μ„ μ–Έλœ ν•¨μˆ˜λŠ” λ°”κΉ₯μͺ½μ— μžˆμ–΄μ„œ 'μ™ΈλΆ€ ν•¨μˆ˜'

yκ°€ μ„ μ–Έλœ ν•¨μˆ˜λŠ” μ•ˆμͺ½μ— μžˆμ–΄μ„œ 'λ‚΄λΆ€ ν•¨μˆ˜'

 

κ·Έλž˜μ„œ 이 ν΄λ‘œμ € ν•¨μˆ˜λŠ” μŠ€μ½”ν”„κ°€ λΆ„λ¦¬λ˜μ–΄ μžˆλ‹€. 

 

μ΄λ•Œ, μ™ΈλΆ€ ν•¨μˆ˜λŠ” y에 μ ‘κ·Ό λΆˆκ°€λŠ₯!

λ‚΄λΆ€ ν•¨μˆ˜λŠ” x에 μ ‘κ·Ό κ°€λŠ₯!

 

 

 

🐜 νŠΉμ§•5. 데이터λ₯Ό λ³΄μ‘΄ν•œλ‹€. 

ν΄λ‘œμ €λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ 싀행이 λλ‚˜λ”λΌλ„, μ™ΈλΆ€ ν•¨μˆ˜ λ‚΄ λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬ 상에 μ €μž₯λœλ‹€. (μ–΄νœ˜μ  ν™˜κ²½μ„ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•΄μ„œ)

// 일반적인 ν•¨μˆ˜λŠ” ν•¨μˆ˜ 싀행이 λλ‚˜κ³  λ‚˜λ©΄ ν•¨μˆ˜ λ‚΄λΆ€μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. 

 

const adder = function (x) {
	return function (y) {
    	return x + y;
    }
}

const add5 = adder(5);

βž₯ λ³€μˆ˜ add5μ—λŠ” ν΄λ‘œμ €λ₯Ό 톡해 λ¦¬ν„΄ν•œ ν•¨μˆ˜κ°€ μžˆλ‹€. 

add5λŠ” adderν•¨μˆ˜μ—μ„œ 인자둜 λ„˜κΈ΄ 5λΌλŠ” 값을 xλ³€μˆ˜μ— 계속 담은 μ±„λ‘œ λ‚¨μ•„μžˆλ‹€.

κ·Έλž˜μ„œ μ™ΈλΆ€ ν•¨μˆ˜ 싀행이 λλ‚˜λ„ 5λΌλŠ” 값은 μ‚¬μš©κ°€λŠ₯ν•˜λ‹€!

 

 

const adder = function (x) {
	return function (y) {
    	return x + y;
    }
}

const add5 = adder(5);
add5(7) // 12
add5(10) // 15

βž₯ λ³€μˆ˜ add5에 각각 7κ³Ό 10을 인자둜 보내면, x에 5값이 λ‚¨μ•„μžˆμ–΄μ„œ 각각 12, 15κ°€ λ‚˜μ˜¨λ‹€. 

 

 

 

🐜 νŠΉμ§•6. 정보 접근을 μ œν•œν•œλ‹€. (μΊ‘μŠν™”) // β­οΈν΄λ‘œμ €λ₯Ό μ“°λŠ” 이유⭐️

const makeCounter = () => {
	let value = 0;
    
    return {
    	increase: () => {
        	value = value + 1
        },
        decrease: () => {
        	value = value - 1
        },
        getValue: () => value
    }
}

const counter1 = makeCounter();

⬆️ 'ν΄λ‘œμ € λͺ¨λ“ˆ νŒ¨ν„΄'

 

makeCounterλ₯Ό μ‹€ν–‰ν•΄μ„œ λ³€μˆ˜λ₯Ό 담아보면 increase, decrease, getValue λ©”μ„œλ“œλ₯Ό ν¬ν•œν•œ 객체λ₯Ό λ¦¬ν„΄ν•œλ‹€. 

λ”°λΌμ„œ λ³€μˆ˜ counter1은 객체!

 

 

β­οΈμ—¬κΈ°μ„œ valueλΌλŠ” λ³€μˆ˜μ— μƒˆλ‘­κ²Œ 값을 ν• λ‹Ήν•  μˆ˜λŠ” μ—†λ‹€. μ™œλƒλ©΄ μŠ€μ½”ν”„ κ·œμΉ™ λ•Œλ¬Έμ—!

 

λ§Œμ•½ valueκ°€ μ „μ—­λ³€μˆ˜μ˜€λ‹€λ©΄, λ‹€λ₯Έ ν•¨μˆ˜λ‚˜ λ‘œμ§μ— μ˜ν•΄ μ˜λ„λ˜μ§€ μ•Šμ€ 변경이 될 수 μžˆλ‹€. 

κ·Έλž˜μ„œ ν΄λ‘œμ €λ₯Ό  ν†΅ν•΄μ„œ λΆˆν•„μš”ν•œ μ „μ—­ λ³€μˆ˜ μ‚¬μš©μ„ 쀄이고, μŠ€μ½”ν”„λ₯Ό μ΄μš©ν•΄μ„œ 값을 보닀 μ•ˆμ „ν•˜κ²Œ λ‹€λ£° 수 μžˆλ‹€. 

 

 

ν΄λ‘œμ €λ₯Ό μ‰½κ²Œ μ΄ν•΄ν•΄λ³΄μž!

κ³„μ’Œμ΄μ²΄λΌκ³  ν•˜λ©΄ λ³€μˆ˜κ°€ 전역일 경우 λˆ„κ΅°κ°€κ°€ μ €μ˜ ν”„λ‘œκ·Έλž¨μ„ κ±΄λ“œλ €μ„œ μ†‘κΈˆλ˜λŠ” κ³„μ’Œλ²ˆν˜Έλ₯Ό λˆ„κ΅°κ°€κ°€ μƒˆλ‘œμš΄ function을 λͺ°λž˜ λ§Œλ“€μ–΄μ„œ μž…λ ₯λ˜λŠ” κ³„μ’Œλ₯Ό 본인의 κ³„μ’Œλ‘œ λ§Œλ“€μ–΄ 버릴 수 μžˆλ‹€. 근데 μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλΌ μ €λ ‡κ²Œ 감싸 λ†“μœΌλ©΄ μ²˜μŒμ— μž…λ ₯ν•˜λŠ” ν•¨μˆ˜μ—μ„œ κ³„μ’Œλ²ˆν˜Έλ₯Ό μž…λ ₯λ°›μ•„μ„œ λ„£μ–΄ 버리고 ν•¨μˆ˜λ₯Ό μ’…λ£Œν•΄ λ²„λ ΈμœΌλ‹ˆ 더이상 λˆ„κ΅°κ°€λŠ” ν•΄λ‹Ή κ³„μ’Œλ²ˆν˜Έλ₯Ό λ°”κΎΈμ–΄ 버릴 수 μ—†λ‹€.

 

그리고 ν΄λ‘œμ €λ‘œ λ§Œλ“€μ–΄μ§„ λˆμ„ λ³΄λ‚΄λŠ” ν•¨μˆ˜κ°€ μ†‘κΈˆν•  λ•Œ ν•΄λ‹Ή κ³„μ’Œλ³€μˆ˜μ— μ ‘κ·Όν•˜λŠ”λ° ν΄λ‘œμ €κ°€ μ•„λ‹ˆλΌ μ „μ—­λ³€μˆ˜λΌλ©΄ μ†‘κΈˆν•˜λŠ” ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 λͺ°λž˜ κ³„μ’Œλ₯Ό 본인 κ³„μ’Œλ‘œ λ°”κΎΈμ–΄λ²„λ¦¬λŠ” 일이 λ°œμƒν•  μˆ˜λ„..!

 

 

 

 

🐜 νŠΉμ§•7. ν•¨μˆ˜ μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. (λͺ¨λ“ˆν™”)

const makeCounter = () => {
	let value = 0;
    
    return {
    	increase: () => {
        	value = value + 1
        },
        decrease: () => {
        	value = value - 1
        },
        getValue: () => value
    }
}

const counter1 = makeCounter();
counter1.increase();
counter1.increase();
counter1.decrease();
counter1.getValue(); // 1

const counter2 = makeCounter();
counter1.decrease();
counter1.decrease();
counter1.decrease();
counter1.getValue(); // -3

 

<μ°Έκ³ >

getValue λ©”μ„œλ“œλŠ” μ™ΈλΆ€ ν•¨μˆ˜μ— μ„ μ–Έλœ value 값을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜λ‹€. 

 

μ€‘μš”ν•œνŠΉμ§• ⭐️

makeCounterλ₯Ό μ‹€ν–‰ν•  λ•Œμ— μ„ μ–Έλ˜λŠ” value 값을 각자 λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ—,

counter1κ³Ό counter2의 valueλŠ” μ„œλ‘œμ—κ²Œ 영ν–₯을 λΌμΉ˜μ§€λŠ” μ•ŠλŠ”λ‹€!!!

 

 

ν΄λ‘œμ €λ₯Ό 톡해 데이터와 λ©”μ„œλ“œλ₯Ό 같이 λ¬Άμ–΄μ„œ λ‹€λ£° 수 μžˆλ‹€. (λͺ¨λ“ˆν™” κ°€λŠ₯)

 

 

 

 


var a = 0;
function foo() {
    var b = 0;
    return function() {
        console.log(++a, ++b);
    };
}

var f1 = foo();
var f2 = foo();

f1(); // --> 1 1
f1(); // --> 2 2
f2(); // --> 3 1 
f2(); // --> 4 2

// f1κ³Ό f2λŠ” 각자 λ…λ¦½μ μœΌλ‘œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— μ „μ—­λ³€μˆ˜μΈ a의 κ°’λ§Œ μ˜¬λΌκ°€κ³  b 값은 각각 κ³„μ‚°λ˜λŠ”κ±°λ‹€.