[πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λ”₯λ‹€μ΄λΈŒ] 12μž₯. ν•¨μˆ˜

λ…Έμ˜μ™„Β·2023λ…„ 10μ›” 17일
0

JavaScript(Deep Dive)

λͺ©λ‘ 보기
7/23
post-thumbnail

ν•¨μˆ˜

1. ν•¨μˆ˜λž€?

ν•¨μˆ˜λŠ” 일련의 과정을 문으둜 κ΅¬ν˜„ν•˜κ³  μ½”λ“œ λΈ”λ‘μœΌλ‘œ κ°μ‹Έμ„œ ν•˜λ‚˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ μ •μ˜ν•œ 것.

ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μž…λ ₯을 전달 λ°›λŠ” λ³€μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜, μž…λ ₯을 인수, 좜λ ₯을 λ°˜ν™˜κ°’μ΄λΌ ν•œλ‹€. λ˜ν•œ, ν•¨μˆ˜λŠ” 값이며, μ—¬λŸ¬κ°œ μ‘΄μž¬ν•  수 μžˆμœΌλ―€λ‘œ νŠΉμ • ν•¨μˆ˜λ₯Ό κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ μ‹λ³„μžμΈ ν•¨μˆ˜ 이름을 μ‚¬μš©ν•  수 μžˆλ‹€.

// ν•¨μˆ˜ μ •μ˜
function add(x, y) {
	return x + y;
}
// ν•¨μˆ˜ 호좜
var result = add(2,5);
// ν•¨μˆ˜ add에 인수 2,5λ₯Ό μ „λ‹¬ν•˜λ©΄μ„œ ν˜ΈμΆœν•˜λ©΄ λ°˜ν™˜κ°’ 7을 λ°˜ν™˜ν•œλ‹€.
console.log(result); // 7

ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ •μ˜λ₯Ό 톡해 μƒμ„±ν•˜λ©° μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ μ •μ˜ν•  수 μžˆλ‹€.

ν•¨μˆ˜ μ •μ˜λ§ŒμœΌλ‘œ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 것은 μ•„λ‹ˆλ‹€. ν•¨μˆ˜ ν˜ΈμΆœμ„ ν†΅ν•΄μ„œ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ³  ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ λ°˜ν™˜κ°’μ„ λ°˜ν™˜ν•œλ‹€.

2. ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

ν•¨μˆ˜λŠ” κ°œλ°œμžκ°€ μ‹€ν–‰ μ‹œμ μ„ κ²°μ •ν•  수 있고, λͺ‡ λ²ˆμ΄λ“  μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. ν•¨μˆ˜λŠ” λͺ‡ λ²ˆμ΄λ“  ν˜ΈμΆœν•  수 μžˆμœΌλ―€λ‘œ μ½”λ“œμ˜ μž¬μ‚¬μš©μ΄λΌλŠ” μΈ‘λ©΄μ—μ„œ 맀우 μœ μš©ν•˜λ‹€.

μ½”λ“œμ˜ 쀑볡을 μ–΅μ œν•˜κ³  μž¬μ‚¬μš©μ„±μ„ λ†’μ΄λŠ” ν•¨μˆ˜λŠ” μœ μ§€λ³΄μˆ˜μ˜ νŽΈμ˜μ„±μ„ 높이고 μ‹€μˆ˜λ₯Ό 쀄여 μ½”λ“œμ˜ 신뒰성을 λ†’μ΄λŠ” νš¨κ³Όκ°€ μžˆλ‹€.

3. ν•¨μˆ˜ λ¦¬ν„°λŸ΄

숫자 값을 숫자 λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•˜κ³ , 객체λ₯Ό 객체 λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•˜λŠ” κ²ƒμ²˜λŸΌ ν•¨μˆ˜λ„ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ 생성할 수 μžˆλ‹€. ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ function ν‚€μ›Œλ“œ, ν•¨μˆ˜ 이름, λ§€κ°œλ³€μˆ˜ λͺ©λ‘, ν•¨μˆ˜ λͺΈμ²΄λ‘œ κ΅¬μ„±λœλ‹€.

// λ³€μˆ˜μ— ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ„ ν• λ‹Ή
var f = function add(x,y) {
	return x + y;
}

βœ”οΈ ν•¨μˆ˜ 이름

  • ν•¨μˆ˜ 이름은 μ‹λ³„μž λ”°λΌμ„œ μ‹λ³„μž 넀이밍 κ·œμΉ™μ„ μ€€μˆ˜ν•΄μ•Ό ν•œλ‹€. ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλŠ” μ‹λ³„μžλ‹€.

βœ”οΈ λ§€κ°œλ³€μˆ˜ λͺ©λ‘

  • 0개 μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ†Œκ΄„ν˜Έλ‘œ 감싸고 μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•œλ‹€.
  • 각 λ§€κ°œλ³€μˆ˜μ—λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μ§€μ •ν•œ μΈμˆ˜κ°€ μˆœμ„œλŒ€λ‘œ ν• λ‹Ήλœλ‹€. 즉, λ§€κ°œλ³€μˆ˜ λͺ©λ‘μ€ μˆœμ„œμ— μ˜λ―Έκ°€ μžˆλ‹€.
  • λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œ λ³€μˆ˜μ™€ λ™μΌν•˜κ²Œ μ·¨κΈ‰λœλ‹€. λ”°λΌμ„œ λ§€κ°œλ³€μˆ˜λ„ λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ‹λ³„μž 넀이밍 κ·œμΉ™μ„ μ€€μˆ˜ν•΄μ•Ό ν•œλ‹€.

βœ”οΈ ν•¨μˆ˜ λͺΈμ²΄

  • ν•¨μˆ˜λ₯Ό ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ μΌκ΄„μ μœΌλ‘œ 싀행될 문듀을 ν•˜λ‚˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ μ •μ˜ν•œ μ½”λ“œ 블둝
  • ν•¨μˆ˜ λͺΈμ²΄λŠ” ν•¨μˆ˜ ν˜ΈμΆœμ— μ˜ν•΄ μ‹€ν–‰λœλ‹€.

πŸ’‘ 일반 객체와 ν•¨μˆ˜ 객체 차이

ν•¨μˆ˜λŠ” 객체닀 ν•˜μ§€λ§Œ 일반 κ°μ²΄μ™€λŠ” λ‹€λ₯΄λ‹€. 일반 κ°μ²΄λŠ” ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ ν•¨μˆ˜λŠ” 호좜 ν•  수 μžˆλ‹€. 그리고 일반 κ°μ²΄μ—λŠ” μ—†λŠ” ν•¨μˆ˜ 객체만의 κ³ μœ ν•œ ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ”λ‹€.

4. ν•¨μˆ˜ μ •μ˜

ν•¨μˆ˜μ •μ˜λž€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° 이전에 인수λ₯Ό 전달받을 λ§€κ°œλ³€μˆ˜μ™€ μ‹€ν–‰ν•  λ¬Έλ“€, 그리고 λ°˜ν™˜ν•  값을 μ§€μ •ν•˜λŠ” 것을 λ§ν•œλ‹€.

ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” λ°©λ²•μ—λŠ” ν•¨μˆ˜ μ„ μ–Έλ¬Έ ν•¨μˆ˜ ν‘œν˜„μ‹ Function μƒμ„±μž ν•¨μˆ˜ ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ μžˆλ‹€.

4-1. ν•¨μˆ˜ μ„ μ–Έλ¬Έ

var add = function add(x, y) {
	return x + y;
}
console.log(add(2,5)); // 7

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μƒμ„±λœ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄ ν•¨μˆ˜ 이름과 λ™μΌν•œ μ΄λ¦„μ˜ μ‹λ³„μžλ₯Ό μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•˜κ³ , 거기에 ν•¨μˆ˜ 객체λ₯Ό ν• λ‹Ήν•œλ‹€.

ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” 것이 μ•„λ‹ˆλΌ ν•¨μˆ˜ 객체λ₯Ό κ°€λ₯΄ν‚€λŠ” μ‹λ³„μžλ‘œ ν˜ΈμΆœν•œλ‹€. 즉, ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μƒμ„±ν•œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 것은 ν•¨μˆ˜ 이름 addκ°€ μ•„λ‹ˆλΌ μžλ°”μŠ€ν¬λ¦…νŠΈ 엔진이 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•œ μ‹λ³„μž add인 것이닀.

4-2. ν•¨μˆ˜ ν‘œν˜„μ‹

κ°’μ˜ μ„±μ§ˆμ„ κ°–λŠ” 개체λ₯Ό 일급 객체라 ν•˜κ³ , μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 일급 객체닀. ν•¨μˆ˜κ°€ 일급 κ°μ²΄λΌλŠ” 것은 ν•¨μˆ˜λ₯Ό κ°’μ²˜λŸΌ 자유둭게 μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 의미이며, λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ ν•¨μˆ˜ μ •μ˜ 방식을 ν•¨μˆ˜ ν‘œν˜„μ‹μ΄λΌ ν•œλ‹€.

// ν•¨μˆ˜ ν‘œν˜„μ‹
var add = fuction (x, y) {
	return x + y;
};

console.log(add(2,5)); //7

// κΈ°λͺ… ν•¨μˆ˜ ν‘œν˜„μ‹
var add = function foo(x,y) {
	return x + y;
};

console.log(add(2,5)); //7

4-3. Function μƒμ„±μž ν•¨μˆ˜

var add = new Function('x', 'y', 'return x + y');
console.log(add(2,5)); // 7

4-4. ν™”μ‚΄ν‘œ ν•¨μˆ˜

const add = (x,y) => x + y;
console.log(add(2,5)); //7

πŸ’‘ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄λž€ ?

ν•¨μˆ˜ 선언문이 μ½”λ“œμ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 고유의 νŠΉμ§•μ„ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄λΌ ν•œλ‹€

5. ν•¨μˆ˜ 호좜

5.1 λ§€κ°œλ³€μˆ˜μ™€ 인수

λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ„ μ–Έν•˜λ©°, ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œ λ³€μˆ˜μ™€ λ™μΌν•˜κ²Œ μ·¨κΈ‰λœλ‹€. 즉, ν•¨μˆ˜κ°€ 호좜되면 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œ μ•”λ¬΅μ μœΌλ‘œ λ§€κ°œλ³€μˆ˜κ°€ μƒμ„±λ˜κ³  일반 λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ undefined둜 μ΄ˆκΈ°ν™”λœ 이후 μΈμˆ˜κ°€ μˆœμ„œλŒ€λ‘œ ν• λ‹Ήλœλ‹€.

λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°ν•  수 있고 ν•¨μˆ˜ λͺΈμ²΄ μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘°ν•  수 μ—†λ‹€. 즉, λ§€κ°œλ³€μˆ˜μ˜ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜ λ‚΄λΆ€λ‹€.

λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ 인수의 κ°œμˆ˜κ°€ μΌμΉ˜ν•˜λŠ”μ§€ μ²΄ν¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

μΈμˆ˜κ°€ 초과되면 μ•”λ¬΄μ μœΌλ‘œ arguments 객체의 ν”„λ‘œνΌν‹°λ‘œ λ³΄κ΄€λœλ‹€.

5.2 μΈμˆ˜ν™•μΈ

function add(x,y) {
	return x + y;
}

console.log(add(2)); // NaN
console.log(add('a', 'b')) // 

βœ”οΈ μœ„ μ½”λ“œμ˜ κ²°κ³Όκ°€ λ‚˜μ˜¨ 이유

  • μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ™€ 인수의 κ°œμˆ˜κ°€ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 동적 νƒ€μž… μ–Έμ–΄λ‹€. λ”°λΌμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ 사전에 지정할 수 μ—†λ‹€.

λ”°λΌμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 경우 ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ μ ˆν•œ μΈμˆ˜κ°€ μ „λ‹¬λ˜μ—ˆλŠ”μ§€ 확인할 ν•„μš”κ°€ μžˆλ‹€.

βœ”οΈ ES6μ—μ„œ λ„μž…λœ λ§€κ°œλ³€μˆ˜ 기본값을 ν•¨μˆ˜ μˆ˜ν–‰

function add(a=0, b=0,c=0) {
	return a + b + c;
}
console.log(add(1,2,3)); // 6
console.log(add(1,2)); // 3
console.log(add(1)); // 1
console.log(add()); // 0

5.3 λ§€κ°œλ³€μˆ˜μ˜ μ΅œλŒ€ 개수

ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λŠ” μ½”λ“œλ₯Ό μ΄ν•΄ν•˜λŠ” 데 λ°©ν•΄λ˜λŠ” μš”μ†Œμ΄λ―€λ‘œ 이상적인 λ§€κ°œλ³€μˆ˜λŠ” 0개이며 μ μ„μˆ˜λ‘ μ’‹λ‹€. λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜κ°€ λ§Žλ‹€λŠ” 것은 ν•¨μˆ˜κ°€ μ—¬λŸ¬ 가지 일을 ν•œλ‹€λŠ” μ¦κ±°μ΄λ―€λ‘œ λ°”λžŒμ§ν•˜μ§€ μ•Šλ‹€. 이상적인 ν•¨μˆ˜λŠ” ν•œ 가지 일만 ν•΄μ•Ό ν•˜λ©° 가급적 μž‘κ²Œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

5.4 λ°˜ν™˜λ¬Έ

ν•¨μˆ˜λŠ” return ν‚€μ›Œλ“œμ™€ ν‘œν˜„μ‹(λ°˜ν™˜κ°’)으둜 이뀄진 λ°˜ν™˜λ¬Έμ„ μ‚¬μš©ν•΄ μ‹€ν–‰ κ²°κ³Όλ₯Ό ν•¨μˆ˜ μ™ΈλΆ€λ‘œ λ°˜ν™˜(return)ν•  수 μžˆλ‹€.

λ°˜ν™˜λ¬Έμ€ 두 가지 역할을 ν•œλ‹€.

  • λ°˜ν™˜λ¬Έμ€ ν•¨μˆ˜μ˜ 싀행을 μ€‘λ‹¨ν•˜κ³  ν•¨μˆ˜ λͺΈμ²΄λ₯Ό λΉ μ Έλ‚˜κ°„λ‹€. λ”°λΌμ„œ λ°˜ν™˜λ¬Έ 이후에 λ‹€λ₯Έ 문이 μ‘΄μž¬ν•˜λ©΄ κ·Έ 문은 μ‹€ν–‰λ˜μ§€ μ•Šκ³  λ¬΄μ‹œλœλ‹€.
  • λ°˜ν™˜λ¬Έμ€ return ν‚€μ›Œλ“œ 뒀에 μ˜€λŠ” ν‘œν˜„μ‹μ„ 평가해 λ°˜ν™˜ν•œλ‹€. return ν‚€μ›Œλ“œ 뒀에 λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  ν‘œν˜„μ‹μ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ undefinedκ°€ λ°˜ν™˜λœλ‹€.

6. 참쑰에 μ˜ν•œ 전달과 μ™ΈλΆ€ μƒνƒœμ˜ λ³€κ²½

객체 νƒ€μž… μΈμˆ˜λŠ” μ°Έμ‘° 값이 λ³΅μ‚¬λ˜μ–΄ λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ λͺΈμ²΄μ—μ„œ μ°Έμ‘° 값을 톡해 객체λ₯Ό λ³€κ²½ν•  경우 원본이 ν›Όμ†λœλ‹€. λ‹€μ‹œ 말해 μ™ΈλΆ€μƒνƒœ 즉 ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ‘œ μ „λ‹¬ν•œ 참쑰값에 μ˜ν•΄ 원본 객체가 λ³€κ²½λ˜λŠ” λΆ€μˆ˜ νš¨κ³Όκ°€ λ°œμƒν•œλ‹€.

μ΄λŸ¬ν•œ 문제 ν•΄κ²° 방법

  • 객체λ₯Ό λΆˆλ³€ 객체둜 λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λŠ” 것
  • κΉŠμ€ 볡사

7. λ‹€μ–‘ν•œ ν•¨μˆ˜μ˜ ν˜•νƒœ

7-1. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— μ¦‰μ‹œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό μ¦‰μ‹œ μ‹€ν–‰ν•¨μˆ˜λΌκ³  ν•˜λ©°, μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” 단 ν•œ 번만 호좜되며 λ‹€μ‹œ ν˜ΈμΆœν•  수 μ—†λ‹€.

// 읡λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
(function () {
	var a = 3;
  	var b = 5;
  	return a * b;
}());

// κΈ°λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
(function () {
	var a = 3;
  	var b = 5;
  	return a * b;
}());
// 보톡 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” 읡λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜κ°€ μΌλ°˜μ μ΄λ‹€.

(function () {
 // ...
}())

(function () {
// ...
})();

!function () {
 // ... 
}()

+function () {
 // ...
}();
// μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ μ˜ˆμ œλ“€μ΄λ©° 첫번째 방식이 κ°€μž₯ μΌλ°˜μ μ΄λ‹€.

7-2. μž¬κ·€ ν•¨μˆ˜

ν•¨μˆ˜κ°€ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” 것을 μž¬κ·€ 호좜이라 ν•œλ‹€. μž¬κ·€ ν•¨μˆ˜λŠ” 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•΄μœ„, 즉 μž¬κ·€ ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€.

μž¬κ·€ ν•¨μˆ˜λŠ” μžμ‹ μ„ λ¬΄ν•œ μž¬κ·€ ν˜ΈμΆœν•œλ‹€. λ‹€λΌμ„œ μž¬κ·€ ν•¨μˆ˜λ₯Ό 멈좜 수 μžˆλŠ” νƒˆμΆœ 쑰건을 λ°˜λ“œμ‹œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€

// 반볡문
function countdown(n) {
	for (let i = n; i >= 0; i--) console.log(i);
}
countdown(10)

// μž¬κ·€ ν•¨μˆ˜
function countdown(n) {
	if(n<0) return;
	console.log(n);
	countdown(n - 1); // μž¬κ·€ 호좜
}
countdown(10)

7-3. 쀑첩 ν•¨μˆ˜

ν•¨μˆ˜ 내뢀에 μ •μ˜λœ ν•¨μˆ˜λ₯Ό 쀑첩 ν•¨μˆ˜ λ˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜λΌ ν•œλ‹€. 그리고 쀑첩 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜λΌ λΆ€λ₯Έλ‹€.

function outer() {
	var x =1 1;
	// 쀑첩 ν•¨μˆ˜
	function inner() {
	var y = 2;
	// μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.
	console.log(x + y); // 3
    } 
inner();
}

outer();

7-4. 콜백 ν•¨μˆ˜

ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ‚΄λΆ€λ‘œ μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λ₯Ό 콜백 ν•¨μˆ˜λΌκ³  ν•œλ‹€

7-4. κ³ μ°¨ ν•¨μˆ˜

맀개 λ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜μ˜ μ™ΈλΆ€μ—μ„œ 콜백 ν•¨μˆ˜λ₯Ό 전달받은 ν•¨μˆ˜λ₯Ό κ³ μ°¨ ν•¨μˆ˜λΌκ³  ν•œλ‹€.

κ³ μ°¨ ν•¨μˆ˜λŠ” 콜백 ν•¨μˆ˜λ₯Ό μžμ‹ μ˜ μΌλΆ€λΆ„μœΌλ‘œ ν•©μ„±ν•œλ‹€.

κ³ μ°¨ ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 전달받은 콜백 ν•¨μˆ˜μ˜ 호좜 μ‹œμ μ„ κ²°μ •ν•΄μ„œ ν˜ΈμΆœν•œλ‹€.

콜백 ν•¨μˆ˜λŠ” κ³ μ°¨ ν•¨μˆ˜μ— μ˜ν•΄ 호좜되며 μ΄λ•Œ κ³ μ°¨ ν•¨μˆ˜λŠ” ν•„μš”μ— 따라 콜백 ν•¨μˆ˜μ— 인수λ₯Ό 전달할 수 μžˆλ‹€.

function repeat(n, f) {
	for (var i = 0; i < n; i++) {
		f(i) // 콜백 ν•¨μˆ˜
    }
}

var logAll = function (i) { // 콜백 ν•¨μˆ˜
	console.log(i)
};

reapeat(5,logAll) // κ³ μ°¨ ν•¨μˆ˜ 호좜

var logOdds = function (i) {
	if (i%2) console.log(i);
};

reapeat(5, logOdds); // 1

7-5. 순수 ν•¨μˆ˜μ™€ λΉ„μˆœμˆ˜ ν•¨μˆ˜

μ–΄λ–€ μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜μ§€λ„ μ•Šκ³  λ³€κ²½ν•˜μ§€λ„ μ•ŠλŠ”, λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†λŠ” ν•¨μˆ˜λ₯Ό 순수 ν•¨μˆ˜

μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜κ±°λ‚˜ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ”, λΆ€μˆ˜ νš¨κ³Όκ°€ μžˆλŠ” ν•¨μˆ˜λ₯Ό λΉ„μˆœμˆ˜ ν•¨μˆ˜

μ™ΈλΆ€ μƒνƒœμ—λŠ” μ˜μ‘΄ν•˜μ§€ μ•Šκ³  ν•¨μˆ˜ λ‚΄λΆ€ μƒνƒœμ—λ§Œ μ˜μ‘΄ν•œλ‹€κ³  해도 κ·Έ λ‚΄λΆ€ μƒνƒœκ°€ 호좜될 λ•Œλ§ˆλ‹€ λ³€ν™”ν•˜λŠ” 값이라면 순수 ν•¨μˆ˜κ°€ μ•„λ‹˜!

πŸ’‘ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μ΄λž€?

순수 ν•¨μˆ˜μ™€ 보쑰 ν•¨μˆ˜μ˜ 쑰합을 톡해 μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λΆ€μˆ˜ 효과λ₯Ό μ΅œμ†Œν™”ν•΄μ„œ λΆˆλ³€μ„±μ„ 지ν–₯ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„. 둜직 내에 μ‘΄μž¬ν•˜λŠ” 쑰건문과 λ°˜λ³΅λ¬Έμ„ μ œκ±°ν•΄μ„œ λΆˆλ³€μ„±μ„ ν•΄κ²°ν•˜λ©°, λ³€μˆ˜ μ‚¬μš©μ„ μ–΅μ œν•˜κ±°λ‚˜ 생λͺ…μ£ΌκΈ°λ₯Ό μ΅œμ†Œν™”ν•΄μ„œ μƒνƒœ 변경을 ν”Όν•΄ 였λ₯˜λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ©€ν‹° νŒ¨λŸ¬λ‹€μž„ μ–Έμ–΄μ΄λ―€λ‘œ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° 뿐만 μ•„λ‹ˆλΌ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ 적극적으둜 ν™œμš”ν•˜κ³  μžˆλ‹€!

0개의 λŒ“κΈ€