πŸ“ŒLanguage/JavaScript

[Deep Dive] ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ 차이, 콜백 ν•¨μˆ˜, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄ ν•„μš”ν•œ 이유

hellohailie 2022. 12. 1. 23:42

βœ”οΈ 이번 정독을 톡해 μ•Œκ²Œ 된 것

ν•¨μˆ˜κ°€ μ™œ ν•„μš”ν•œκ°€μš”?
ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹μ€ μ–΄λ–€ 차이가 μžˆλ‚˜μš”?
μ›μ‹œ νƒ€μž… μΈμˆ˜μ™€ 객체 νƒ€μž… μΈμˆ˜λŠ” μ–΄λ–€ 차이가 μžˆλ‚˜μš”?
ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 무엇이고 μ™œ ν•„μš”ν•œκ°€μš”?

 

<λ‹΅ 미리보기>

 

πŸ€” ν•¨μˆ˜κ°€ μ™œ ν•„μš”ν•œκ°€μš”?

πŸ€“ ν•¨μˆ˜λŠ” λͺ‡ λ²ˆμ΄λ“  ν˜ΈμΆœν•  수 μžˆμœΌλ―€λ‘œ μ½”λ“œμ˜ μž¬μ‚¬μš© μΈ‘λ©΄μ—μ„œ 맀우 μœ λ¦¬ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 그리고 μœ μ§€λ³΄μˆ˜μ˜ νŽΈμ˜μ„±μ„ 높이고 μ‹€μˆ˜λ₯Ό μ€„μ—¬μ„œ μ½”λ“œμ˜ 신뒰성을 λ†’μ΄λŠ” νš¨κ³Όκ°€ μžˆμŠ΅λ‹ˆλ‹€. 

 

πŸ€” ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹μ€ μ–΄λ–€ 차이가 μžˆλ‚˜μš”?

πŸ€“ ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹ λͺ¨λ‘ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŠΉμ§•μœΌλ‘œ μΈν•˜μ—¬ ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚œλ‹€λŠ” νŠΉμ§•μ΄ μžˆμ§€λ§Œ, (λŸ°νƒ€μž„ 이전에 μ‹λ³„μžλ₯Ό 생성함)

ν•¨μˆ˜ 선언문은 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ μ‹λ³„μžλŠ” ν•¨μˆ˜ 객체둜 μ΄ˆκΈ°ν™”λ˜μ–΄ μ„ μ–Έλ¬Έ 이전에 ν˜ΈμΆœν•˜λ©΄ 호좜이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 

ν•˜μ§€λ§Œ ν•¨μˆ˜ ν‘œν˜„μ‹μ€ undefined둜 μ΄ˆκΈ°ν™” 된 ν›„ λŸ°νƒ€μž„μ— ν‰κ°€λ˜λ―€λ‘œ ν‘œν˜„μ‹ 이전에 ν˜ΈμΆœν•˜λ©΄ undefined으둜 ν‰κ°€λ©λ‹ˆλ‹€. 

(ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…κ³Ό 같은 κ³Όμ •)

 

πŸ€” μ›μ‹œ νƒ€μž… μΈμˆ˜μ™€ 객체 νƒ€μž… μΈμˆ˜λŠ” μ–΄λ–€ 차이가 μžˆλ‚˜μš”?

πŸ€“ μ›μ‹œ νƒ€μž… μΈμˆ˜λŠ” κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ–΄ λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ κ·Έ 값을 변경해도 원본은 ν›Όμ†λ˜μ§€ μ•ŠλŠ”λ‹€. (λΆ€μˆ˜ νš¨κ³Όλ„ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. = μˆœμˆ˜ν•¨μˆ˜)

객체 νƒ€μž… μΈμˆ˜λŠ” μ°Έμ‘° 값이 λ³΅μ‚¬λ˜μ–΄ λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ°Έμ‘° 값을 톡해 객체λ₯Ό λ³€κ²½ν•  경우 원본이 ν›Όμ†λœλ‹€.(λΆ€μˆ˜ νš¨κ³Όκ°€ λ°œμƒν•œλ‹€. = λΉ„μˆœμˆ˜ν•¨μˆ˜)

 

πŸ€” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 무엇이고 μ™œ ν•„μš”ν•œκ°€μš”?

πŸ€“ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 순수 ν•¨μˆ˜μ™€ 보쑰 ν•¨μˆ˜μ˜ 쑰합을 톡해 μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λΆ€μˆ˜ 효과λ₯Ό μ΅œμ†Œν™”ν•΄μ„œ λΆˆλ³€μ„±μ„ 지ν–₯ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ 적극 ꢌμž₯ν•˜λŠ” μ΄μœ λŠ” μˆœμˆ˜ν•¨μˆ˜λ₯Ό 톡해 λΆ€μˆ˜ 효과λ₯Ό μ΅œλŒ€ν•œ μ–΅μ œν•΄μ„œ 였λ₯˜λ₯Ό ν”Όν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ λ†’μ΄λ €λŠ” λ…Έλ ₯의 μΌν™˜μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 


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

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

 

μš©μ–΄λ₯Ό μ œλŒ€λ‘œ μ•Œκ³  λ©΄μ ‘μ—μ„œ μ œλŒ€λ‘œ λ§ν•˜μž!!

 

인수λ₯Ό λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜μ— μ „λ‹¬ν•˜λ©΄μ„œ ν•¨μˆ˜μ˜ 싀행을 λͺ…μ‹œμ μœΌλ‘œ μ§€μ‹œν•΄μ•Ό ν•¨μˆ˜ 호좜이 λ©λ‹ˆλ‹€. 

 

 


βœ”οΈ ν•¨μˆ˜ μ •μ˜ 방식

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

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

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

4. ν™”μ‚΄ν‘œ ν•¨μˆ˜(ES6)

 

 

1. ν•¨μˆ˜ μ„ μ–Έλ¬Έ (ν•¨μˆ˜ 객체둜 μ΄ˆκΈ°ν™”)

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

2. ν•¨μˆ˜ ν‘œν˜„μ‹ (undefined둜 μ΄ˆκΈ°ν™”)

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

3. Function μƒμ„±μž ν•¨μˆ˜ => ν΄λ‘œμ €λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„μ„œ κΈ°μ‘΄ ν•¨μˆ˜μ™€ λ™μΌν•˜κ²Œ μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€. (ν΄λ‘œμ € κ³΅λΆ€ν•„μš”!)

let add = new Function('x','y','return x+y');

4. ν™”μ‚΄ν‘œ ν•¨μˆ˜(ES6)

let add = (x,y) => x + y;

 


βœ”οΈ ν•¨μˆ˜ 인수 확인

  • JS ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ™€ 인수의 κ°œμˆ˜κ°€ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜μ§€ μ•ŠλŠ”λ‹€.
  • JSλŠ” 동적인 νƒ€μž… 언어이닀. κ·Έλž˜μ„œ JS ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ 사전에 지정할 수 μ—†λ‹€. ===> 이게 νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ λ‚˜μ˜¨ 이유!

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ™€ 같은 정적 νƒ€μž…μ„ μ„ μ–Έν•  수 μžˆλŠ” μžλ°”μŠ€ν¬λ¦½λŠμ˜ μƒμœ„ ν™•μž₯을 λ„μž…ν•΄μ„œ 컴파일 μ‹œμ μ— λΆ€μ μ ˆν•œ ν˜ΈμΆœμ„ 방지할 수 μžˆλ‹€. 

 


βœ”οΈ μ°Έμ‘°μ— μ˜ν•œ 전달과 μ™ΈλΆ€ μƒνƒœμ˜ λ³€κ²½

function change(primitive, obj) {
	primitive += 100;
    obj.name = 'kim';
}

let num = 100;
let person = {name: 'lee'};

console.log(num); // 100
console.log(person); // {name: 'lee'};

change(num, person) // λ§€κ°œλ³€μˆ˜μ— 인자λ₯Ό λ„£μ–΄μ„œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚΄

console.log(num); // 100 ==> μ›μ‹œκ°’μ€ 원본이 ν›Όμ†λ˜μ§€ μ•ŠλŠ”λ‹€. 
console.log(person); // {name: 'kim'}; ==> κ°μ²΄λŠ” 원본이 ν›Όμ†λœλ‹€.

μ›μ‹œκ°’μ€ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ immutable value!

κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ mutable value이닀!

 

β˜… μ›μ‹œ νƒ€μž… μΈμˆ˜λŠ” κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ–΄ λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ κ·Έ 값을 변경해도 원본은 ν›Όμ†λ˜μ§€ μ•ŠλŠ”λ‹€. ===> ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ „λ‹¬ν•œ μ›μ‹œ κ°’μ˜ 원본을 λ³€κ²½ν•˜λŠ” μ–΄λ– ν•œ λΆ€μˆ˜ νš¨κ³Όλ„ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. 

 

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

 


βœ”οΈ μž¬κ·€ ν•¨μˆ˜

자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 

μž¬κ·€ν•¨μˆ˜λŠ” λ°˜λ³΅λ˜λŠ” 처리λ₯Ό μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€. 

 

μ•„λž˜μ˜ μ˜ˆμ‹œμ²˜λŸΌ for 문을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  μž¬κ·€ν•¨μˆ˜λ‘œ λ°˜λ³΅λ˜λŠ” 처리λ₯Ό ν•  수 μžˆλ‹€. 

 

function countupA(n) {
	for(let i = 1; i <= n; i++){
    	console.log(i)
    }
}

countupA(10)

// 1~10

 

function countupB(n) {
	if(n>10) return;
    console.log(n)
    countupB(n+1)
}

countupB(1)

// 1~10

 

βŠ™ μž¬μ·¨ν•¨μˆ˜λŠ” μž¬κ·€ ν˜ΈμΆœμ„ 멈좜 수 μžˆλŠ” νƒˆμΆœ 쑰건을 λ°˜λ“œμ‹œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. νƒˆμΆœ 쑰건이 μ—†λ‹€λ©΄ λ¬΄ν•œ λ°˜λ³΅μ— λΉ μ Έ μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš° μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•΄μ•Όν•©λ‹ˆλ‹€. 

 

 


βœ”οΈ μ½œλ°± ν•¨μˆ˜

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

 

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

 

콜백 ν•¨μˆ˜λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 뿐만 μ•„λ‹ˆλΌ 비동기 처리 (이벀트 처리, Ajax 톡신, 타이머 ν•¨μˆ˜ λ“±)와 λ°°μ—΄ κ³ μ°¨ν•¨μˆ˜μ—μ„œλ„ μ‚¬μš©λ˜λŠ” μ€‘μš”ν•œ νŒ¨ν„΄μž…λ‹ˆλ‹€. 


 

βœ”οΈ 순수 ν•¨μˆ˜μ™€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

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

let count = 0;

//μˆœμˆ˜ν•¨μˆ˜
function increase(n) {
	return ++n;
}

count = increase(count);
console.log(count); //1

count = increase(count);
console.log(count); //2

μˆœμˆ˜ν•¨μˆ˜λŠ” λ™μΌν•œ μΈμˆ˜κ°€ μ „λ‹¬λ˜λ©΄ μ–Έμ œλ‚˜ λ™μΌν•œ 값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 

 

 

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

let count = 0;

//λΉ„μˆœμˆ˜ν•¨μˆ˜
function increase() {
	return ++count; // μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜λ©° μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•œλ‹€. 
}

increase();
console.log(count); //1

increase();
console.log(count); //2

 

βŠ™ ν•¨μˆ˜κ°€ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λ©΄ μƒνƒœ λ³€ν™”λ₯Ό μΆ”μ ν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€. κ·Έλž˜μ„œ ν•¨μˆ˜ μ™ΈλΆ€ μƒνƒœμ˜ 변경을 μ§€μ–‘ν•˜λŠ” 순수 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. 

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 순수 ν•¨μˆ˜μ™€ 보쑰 ν•¨μˆ˜μ˜ 쑰합을 톡해 μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λΆ€μˆ˜ 효과λ₯Ό μ΅œμ†Œν™”ν•΄μ„œ λΆˆλ³€μ„±μ„ 지ν–₯ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€. 

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ 적극 ꢌμž₯ν•˜λŠ” μ΄μœ λŠ” μˆœμˆ˜ν•¨μˆ˜λ₯Ό 톡해 λΆ€μˆ˜ 효과λ₯Ό μ΅œλŒ€ν•œ μ–΅μ œν•΄μ„œ 였λ₯˜λ₯Ό ν”Όν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ λ†’μ΄λ €λŠ” λ…Έλ ₯의 μΌν™˜μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 

 

 

 

 

πŸ‘©‍πŸ’» λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Diveλ₯Ό μ •λ…ν•˜κ³  μ œκ°€ μ΄ν•΄ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€ πŸ‘©‍πŸ’»