Front-End/JavaScript

[μžλ°”μŠ€λ¦½νŠΈ(JavaScript )] 12. ν•¨μˆ˜μ˜ λ‹€μ–‘ν•œ ν˜•νƒœ (μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜, λ‚΄λΆ€ ν•¨μˆ˜, callback λ“±)

Bigone17 2022. 2. 21. 18:46

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

  - ν•¨μˆ˜λŠ” μ—¬λŸ¬ 가지 ν˜•νƒœλ₯Ό 가지고 있고, κ·Έ ν˜•νƒœμ— 따라 λΆ€λ₯΄λŠ” λͺ…칭이 λ‹€λ¦…λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” 4가지 ν˜•νƒœμ— λŒ€ν•΄μ„œ μ–˜κΈ°ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

  • μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
  • λ‚΄λΆ€ ν•¨μˆ˜
  • μž¬κ·€ ν•¨μˆ˜
  • 콜백(callback) ν•¨μˆ˜

 

 

🟣 1.1 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

  - ν•¨μˆ˜κ°€ μ •μ˜λ¨κ³Ό λ™μ‹œμ— 싀행이 λ˜λŠ” ν•¨μˆ˜λ₯Ό μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜(IIFE, Immediately Invoke Function Expression)라고 ν•©λ‹ˆλ‹€. 

 - μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” 졜초 ν•œ 번만 호좜이 되고 λ‹€μ‹œ ν˜ΈμΆœν•  μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 주둜 μ΄ˆκΈ°ν™” μ²˜λ¦¬μ— μ‚¬μš©μ΄ λ©λ‹ˆλ‹€.

// κΈ°λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
(function hi() {
	console.log('Hello!');
}());

hi(); //error -> hi is not defined : hiλΌλŠ” ν•¨μˆ˜λŠ” μ¦‰μ‹œ μ‹€ν–‰λœ ν›„ μ‚¬λΌμ§€λ―€λ‘œ μž¬μ‚¬μš©μ΄ λΆˆκ°€ν•˜λ‹€.

----------------------------------------------------------------------------------------------


// 읡λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
let sum;
(function() {
	sum = 20;
}());

console.log(sum); // 20

 

 

🟣 1.2 λ‚΄λΆ€ ν•¨μˆ˜

 - ν•¨μˆ˜ 내뢀에 μ„ μ–Έλœ ν•¨μˆ˜λ₯Ό λ‚΄λΆ€ ν•¨μˆ˜(Inner Function)라 ν•©λ‹ˆλ‹€.

function animal(specie, name) {
	let animalInfo = {
    	specie : specie,
        name : name
    }
	function introduce() {
    	console.log(`Hello! My name is ${name}, I'm ${specie}`);
    }
    
    introduce();
}

animal('dog', 'κΎΈκΈ°'); // Hello! My name is κΎΈκΈ°, I'm dog

- μœ„ μ˜ˆμ œμ—μ„œ animal은 λΆ€λͺ¨ ν•¨μˆ˜μ΄κ³ , introduceλŠ” λ‚΄λΆ€ ν•¨μˆ˜κ°€ λ©λ‹ˆλ‹€.

 

- λΆ€λͺ¨ ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œλŠ” λ‚΄λΆ€ ν•¨μˆ˜μ— μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

function sayHi(name){
	function hi(){
    	console.log('Hi! ' + name);
    }	
    hi();
}

sayHi('μŠˆλ‹ˆ') // Hi! μŠˆλ‹ˆ
hi(); / error -> hi is not defined : λΆ€λͺ¨ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ λ‚΄λΆ€ ν•¨μˆ˜μ— μ ‘κ·Ό ν•  수 μ—†λ‹€.

 

 

🟣 1.3 μž¬κ·€ ν•¨μˆ˜

 - μž¬κ·€ ν•¨μˆ˜(Recusice Function)λŠ” 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ₯Ό λœ»ν•©λ‹ˆλ‹€.

- μž¬κ·€ ν•¨μˆ˜λŠ” μžμ‹ μ„ λ¬΄ν•œνžˆ 연쇄 ν˜ΈμΆœν•˜λ―€λ‘œ νƒˆμΆœ 쑰건을 κ±Έμ–΄ 놓지 μ•ŠμœΌλ©΄, λ¬΄ν•œ 호좜이 λ˜μ–΄ stackoverflow μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

function minus(n) {
	if(n == 0) {
    	console.log('End');
    	return n;
    }
    console.log(n-1);
    return minus(n - 1);
}

minus(5);
// 4
// 3
// 2
// 1
// 0
// End


// νƒˆμΆœ 쑰건이 μ—†λŠ” 경우
function minus(n) {
    return minus(n - 1);
}

minus(5); //error -> Maximum call stack size exceeded

 - μž¬κ·€ ν•¨μˆ˜κ°€ ν•˜λŠ” κΈ°λŠ₯은 λ°˜λ³΅λ¬ΈμœΌλ‘œλ„ κ°€λŠ₯ν•˜λ―€λ‘œ, μ΅œλŒ€ν•œ λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜λŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€. μž¬κ·€ ν•¨μˆ˜λ₯Ό 잘 λͺ¨λ₯΄κ³  μ‚¬μš©ν•  경우 stackoverflow μ—λŸ¬κ°€ 잘 λ°œμƒν•˜λ―€λ‘œ 쑰심해야 λ©λ‹ˆλ‹€.

 

 

🟣 1.4 콜백(callback) ν•¨μˆ˜

 - 콜백 ν•¨μˆ˜λŠ” ν•¨μˆ˜λ₯Ό νŠΉμ • μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ μ‹œμŠ€ν…œμ— μ˜ν•΄μ„œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό λœ»ν•©λ‹ˆλ‹€.

- 많이 μ‚¬μš©λ˜λŠ” 곳은 이벀트 ν•Έλ“€λŸ¬μž…λ‹ˆλ‹€. (ex:클릭 μ‹œ ν•¨μˆ˜ 호좜, μ—”ν„° μ‹œ ν•¨μˆ˜ 호좜 λ“±λ“±)

<!DOCTYPE html>
<html>
<body>
  <button id="myButton">Click me</button>
  <script>
    var button = document.getElementById('myButton');
    // button이 ν΄λ¦­λ˜μ—ˆμ„ λ•Œ, ν•¨μˆ˜λ₯Ό μ‹€ν–‰.
    button.addEventListener('click', function() {
      alert('λ²„νŠΌμ΄ ν΄λ¦­λμŠ΅λ‹ˆλ‹€!');
    });
  </script>
</body>
</html>

 

// 1초 ν›„ ν•¨μˆ˜ μ‹€ν–‰
setTimeout(function () {
  console.log('1초 ν›„ 좜λ ₯λœλ‹€.');
}, 1000);

 

- 콜백 ν•¨μˆ˜λŠ” 주둜 비동기식 μ²˜λ¦¬μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€. 비동기식 μ²˜λ¦¬λŠ” μ²˜λ¦¬κ°€ μ’…λ£Œλ˜λ©΄ 호좜될 ν•¨μˆ˜(콜백 ν•¨μˆ˜)λ₯Ό 미리 λ§€κ°œλ³€μˆ˜μ— 전달해놨닀가 μ²˜λ¦¬κ°€ μ’…λ£Œλ˜λ©΄ 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

function afterCall(){
	setTimeout(function(){
    	console.log('1μ΄ˆν›„ μ‹€ν–‰λœ μ½”λ“œ');
    });
}

afterCall();
console.log('더 늦게 ν˜ΈμΆœν–ˆλŠ”λ° λ¨Όμ € λ‚˜μ˜΄');

// 더 늦게 ν˜ΈμΆœν–ˆλŠ”λ° λ¨Όμ € λ‚˜μ˜΄
// 1μ΄ˆν›„ μ‹€ν–‰λœ μ½”λ“œ

 

 

 

 

πŸ“ μ •λ¦¬ 

  • ν•¨μˆ˜μ—λŠ” μ—¬λŸ¬ 가지 μ’…λ₯˜κ°€ μžˆλ‹€.
  • μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” μ„ μ–Έκ³Ό λ™μ‹œμ— 싀행이 되고, μž¬μ‚¬μš©μ΄ λΆˆκ°€ν•˜λ‹€. μ΄ˆκΈ°ν™”μ— 주둜 μ‚¬μš©λœλ‹€
  • λ‚΄λΆ€ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 내뢀에 μ„ μ–Έλœ ν•¨μˆ˜λ₯Ό 뜻 ν•œλ‹€. λΆ€λͺ¨ ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ λ‚΄λΆ€ ν•¨μˆ˜ ν˜ΈμΆœμ€ λΆˆκ°€ν•˜λ‹€.
  • μž¬κ·€ ν•¨μˆ˜λŠ” 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. νƒˆμΆœ 쑰건을 주지 μ•ŠμœΌλ©΄ λ¬΄ν•œ ν˜ΈμΆœμ„ ν•΄μ„œ 였λ₯˜κ°€ λ‚œλ‹€.
  • 콜백 ν•¨μˆ˜λŠ” μ–΄λ– ν•œ μ²˜λ¦¬κ°€ 이루어진 후에 μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜μ΄λ‹€. 주둜 이벀트 ν•Έλ“€λŸ¬μ—μ„œ μ‚¬μš©λœλ‹€.

 

 

 

 

κΈ΄ κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ :) 
ν‹€λ¦° λ‚΄μš©μ΄ μžˆκ±°λ‚˜, 덧뢙일 λ‚΄μš©μ΄ μžˆλ‹€λ©΄ μ–Έμ œλ“ μ§€ λŒ“κΈ€ λ‹¬μ•„μ£Όμ„Έμš”!
제 글이 μ‘°κΈˆμ΄λ‚˜λ§ˆ μ½μœΌμ‹  λΆ„λ“€μ—κ²Œ 도움이 λ˜λ„λ‘ λ…Έλ ₯ν•˜κ² μŠ΅λ‹ˆλ‹€
λ‹€μŒ νŽΈμ— λ΄¬μš”~

728x90
λ°˜μ‘ν˜•