B9 : ν•¨μˆ˜μ™€ ν•¨μˆ˜μ˜ μ„ μ–Έ

2025. 8. 15. 14:47ㆍFront-end/JavaScript

λ°˜μ‘ν˜•

λͺ©μ°¨

1. ν•¨μˆ˜

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

    1-2. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜

2. ν•¨μˆ˜ ꡬ성 μš”μ†Œ

    2-1. ꡬ성 μš”μ†Œ

    2-2. λ§€κ°œλ³€μˆ˜ (parameter)

    2-3. κΈ°λ³Έκ°’ (default value)

    2-4. λ°˜ν™˜κ°’ (return value)

3. ν•¨μˆ˜ 생성 방법 3κ°€μ§€

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

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

    3-3. 읡λͺ… ν•¨μˆ˜& ν™”μ‚΄ν‘œ ν•¨μˆ˜


1. ν•¨μˆ˜

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

ν•¨μˆ˜λŠ” κ°μ²΄μ˜ νŠΉλ³„ν•œ ν˜•νƒœλ‘œ, λ¬Έ(statement)둜 κ΅¬μ„±λœ λͺΈμ²΄λ₯Ό κ°€μ§„ ν•˜λ‚˜μ˜ μ‹€ν–‰ λ‹¨μœ„μ΄λ‹€.

function doSomething() {	// ν•¨μˆ˜ μ„ μ–Έ
  console.log('hello');
}

doSomthing()	// ν•¨μˆ˜ ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©

 

 

μ—¬λŸ¬ κ³³μ—μ„œ λΉ„μŠ·ν•œ μ½”λ“œκ°€ 쓰일 λ•Œ, μ½”λ“œμ˜ 쀑볡을 쀄이기 μœ„ν•΄ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ‚΄μž₯ ν•¨μˆ˜λ‘œ alert(message), prompt(message, default), confirm(question) λ“±μ΄ μžˆλŠ”λ°,

ν•„μš”ν•œ ν•¨μˆ˜λ₯Ό 직접 λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

function ν‚€μ›Œλ“œ, ν•¨μˆ˜λͺ…, λ§€κ°œλ³€μˆ˜λ₯Ό μž‘μ„±ν•˜μ—¬ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.

function ν•¨μˆ˜λͺ…(parameter1, parameter2, ... parameterN) {
  λ™μž‘ μ½”λ“œ
}

//e.g.
let name = prompt('이름을 μž…λ ₯ν•˜μ„Έμš”: ', '');
function sayHello(name) {
  console.log(`Hello ${name}`);
}

sayHello();

 

 

2. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” μΌκΈ‰ ν•¨μˆ˜ (first-class function)으둜, λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜, λ°˜ν™˜κ°’μ΄ 될 수 μžˆλ‹€.

e.g.) DOM에 이벀트λ₯Ό μΆ”κ°€ν•˜λŠ” μ½œλ°±ν•¨μˆ˜ addEventListener()

button.addEventListener('click', callback);	// addEventListenerν•¨μˆ˜μ— callback()을 인자둜 λ„˜κΉ€

2. ν•¨μˆ˜ ꡬ성 μš”μ†Œ

1. ꡬ성 μš”μ†Œ

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” function ν‚€μ›Œλ“œλ‘œ μ •μ˜λ˜λ©°, μ•„λž˜μ˜ ꡬ성 μš”μ†Œλ₯Ό κ°€μ§„λ‹€.

  • ν•¨μˆ˜λͺ…(μ‹λ³„μž) : ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•  λ³€μˆ˜μ˜ 이름
  • λ§€κ°œλ³€μˆ˜(인자) : κ΄„ν˜Έ μ•ˆμ—μ„œ μ‰Όν‘œλ‘œ κ΅¬λΆ„λ˜λ©°, ν•¨μˆ˜ λ‚΄ μ§€μ—­λ³€μˆ˜μ²˜λŸΌ 이용됨
  • λͺΈμ²΄ : μ€‘κ΄„ν˜Έ{} μ•ˆμ— μ •μ˜ν•˜λ©°, ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ μ‹€ν–‰λ˜λŠ” ꡬ문 μ§‘ν•©
function μ‹λ³„μž(인자) {
  λͺΈμ²΄
}

 

2. λ§€κ°œλ³€μˆ˜ (parameter)

인수 (argument) 전달

  • λ§€κ°œλ³€μˆ˜ name : ν•¨μˆ˜ λ‚΄μ—μ„œ μ§€μ—­λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©λ¨
function sayHi(name) {
  return `Hi ${name}`;
}

console.log(sayHi());  // Hi undefined
console.log(sayHi(bang));	// Hi bang

 

βœ… argument 객체

ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ œμ™Έν•œ λͺ¨λ“  ν•¨μˆ˜μ—μ„œλŠ” argument 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜μ— μ „λ‹¬λœ μΈμžλ“€μ„ μ°Έμ‘°ν•  수 μžˆλ‹€.

function sum(x, y, z) {
	console.log(arguments[0]);	// 1
    console.log(arguments[1]);	// 2
    console.log(arguments[2]);	// undefined
    console.log(arguments.length);	//2
    return x + y + z;
}

sum(1, 2);	// NaN

 

 

 

3. κΈ°λ³Έκ°’ (default value)

  • 맀개 λ³€μˆ˜μ—λŠ” 인수둜 아무것도 μ•ˆλ“€μ–΄μ™”μ„ λ•Œ μ§€μ •ν•  기본값을 μ§€μ •ν•  수 μžˆλ‹€.
  • μΈμˆ˜λ„, 기본값도 μ—†μœΌλ©΄ ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜λŠ” undefineκ°€ ν• λ‹Ήλœλ‹€.
function showMessage(from, text = "no text") {
    alert(from + ' : ' + text);
}

 

4. λ°˜ν™˜κ°’ (return value)

ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ return μ§€μ‹œμžλ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμ • 값을 λ°˜ν™˜ν•˜κ²Œ ν•  수 μžˆλ‹€.

// 1. 인수 전달
function showMessage(from, text) {
    alert(from + ' : ' + text);
}

showMessage('Bang', 'Hello!');
showMessage('Kim', 'Good Morning!');

// 2. κΈ°λ³Έκ°’ μ§€μ •
function showMessage(from, text = 'no comment') { ... }

// 3. λ°˜ν™˜κ°’ μ§€μ •
function showMessage(from, text) {
  return from + ': ' + text
  • return은 ν•¨μˆ˜ λ‚΄ μ–΄λ””μ„œλ“  μ‚¬μš©ν•  수 μžˆλ‹€.
  • return을 λ§Œλ‚˜λ©΄ ν•¨μˆ˜ 싀행이 μ€‘λ‹¨λ˜κ³ , ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 곳에 값을 λ°˜ν™˜ν•œλ‹€.
  • κ°’ 없이 return; λ§Œ μž‘μ„±ν•˜λ©΄ ν•¨μˆ˜λ₯Ό μ’…λ£Œμ‹œν‚¨λ‹€. (returnλ¬Έμ΄λ‚˜ λ°˜ν™˜κ°’μ΄ μ—†μœΌλ©΄ return은 undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.)
  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” return λ¬Έ 끝에 μžλ™μœΌλ‘œ μ„Έλ―Έμ½œλ‘ (;)을 λ„£λŠ”λ‹€. λ”°λΌμ„œ μ€„λ°”κΏˆμ„ ν•˜λ©΄ μ•ˆλœλ‹€.

3. ν•¨μˆ˜ 생성 방법 3κ°€μ§€

ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 방법은 ν•¨μˆ˜ μ„ μ–Έλ¬Έ, ν•¨μˆ˜ ν‘œν˜„μ‹, Function μƒμ„±μž ν•¨μˆ˜ μ΄λ ‡κ²Œ 3κ°€μ§€κ°€ μžˆλ‹€.

이 쀑 Function μƒμ„±μž ν•¨μˆ˜λŠ” λ³΄μ•ˆ 및 μ„±λŠ₯ λ¬Έμ œκ°€ μžˆμ–΄ ꢌμž₯λ˜μ§€ μ•ŠλŠ”λ‹€.

 

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

  • λ…μžμ μΈ ꡬ문 ν˜•νƒœλ‘œ μ‘΄μž¬ν•œλ‹€.
  • ν˜Έμ΄μŠ€νŒ…(hoisting)이 λœλ‹€.
    • ν˜Έμ΄μŠ€νŒ… : ν•¨μˆ˜κ°€ μ„ μ–Έλœ μœ„μΉ˜μ—μ„œ μ½”λ“œμ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ €μ§€λŠ” 것
    • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 슀크립트 μ‹€ν–‰ μ „, μ€€λΉ„ λ‹¨κ³„μ—μ„œ ν•¨μˆ˜λ₯Ό μƒμ„±ν•œλ‹€. → ν•¨μˆ˜ 선언문이 μ •μ˜λ˜κΈ° 전에도 ν˜ΈμΆœν•  수 μžˆλ‹€.
  • ν•¨μˆ˜κ°€ μ„ μ–Έλœ μ½”λ“œ 블둝 μ•ˆμ—μ„œλ§Œ μœ νš¨ν•˜λ‹€. → ifλ¬Έ μ•ˆμ—μ„œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν–ˆλ‹€λ©΄ ν•΄λ‹Ή ifλ¬Έ μ•ˆμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯
function sum(a, b) {
  return a + b;
}

 

 

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

  • ν•¨μˆ˜ 이름이 선택사항이며, λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό 직접 ν• λ‹Ήν•œλ‹€. (ν‘œν˜„μ‹/ꡬ문 ꡬ성 내뢀에 μƒμ„±λœλ‹€)
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ‹€μ œ 흐름이 ν•΄λ‹Ή ν•¨μˆ˜μ— λ„λ‹¬ν–ˆμ„ λ•Œ ν•¨μˆ˜λ₯Ό μƒμ„±ν•œλ‹€. → ν•¨μˆ˜ ν‘œν˜„ μœ„μΉ˜λ³΄λ‹€ μƒλ‹¨μ—μ„œ 호좜될 수 μ—†λ‹€.
  • ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λ©΄, ν•¨μˆ˜λ₯Ό μ–΄λ””μ—μ„œ 선언해도 ν• λ‹Ήν•œ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” κ³³μ—μ„œ μœ νš¨ν•˜λ‹€.
let sum = function(a, b) {
  return a + b;
}

 

 

보톡은 ν•¨μˆ˜ ν‘œν˜„μ‹μ—μ„œ ν•¨μˆ˜μ˜ 이름을 μƒλž΅ν•˜λ‚˜, ν•¨μˆ˜ 이름을 ν‘œν˜„ν•˜λŠ” κΈ°λͺ… ν•¨μˆ˜ ν‘œν˜„μ‹λ„ μžˆλ‹€.

κΈ°λͺ… ν•¨μˆ˜ ν‘œν˜„μ‹μ—μ„œ μ •μ˜ν•œ ν•¨μˆ˜μ˜ 이름은 ν•¨μˆ˜μ˜ λͺΈμ²΄ μ•ˆμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

const factorial = function doSometing(n) {
  return (n <= 1) ? 1 : n * doSomething(n-1);
}

console.log(factorial(5));	// 120

주둜 ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μž¬κ·€ ν˜ΈμΆœν•  λ•Œ μ‚¬μš©ν•œλ‹€.

 

 

3. 읡λͺ… ν•¨μˆ˜ & ν™”μ‚΄ν‘œ ν•¨μˆ˜

βœ… μ΅λͺ… ν•¨μˆ˜

이름 없이 μ„ μ–Έν•œ ν•¨μˆ˜λ₯Ό 읡λͺ… ν•¨μˆ˜λΌκ³  λΆ€λ₯Έλ‹€.

읡λͺ… ν•¨μˆ˜λŠ” λ³€μˆ˜μ— ν• λ‹Ήλœ 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ„ μ–Έν•œ λΈ”둝 λ°–μ—μ„œ 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€.

function ask(question, yes, no) {
  if(confirm(question)) yes()
  else no();
}

ask(
  "λ™μ˜ν•˜μ‹­λ‹ˆκΉŒ?",
  function() { alert("λ™μ˜ν–ˆμŠ΅λ‹ˆλ‹€."); }	// 읡λͺ… ν•¨μˆ˜
  function() { alert("μ·¨μ†Œν–ˆμŠ΅λ‹ˆλ‹€."); }	// 읡λͺ… ν•¨μˆ˜
);

 

βœ… ν™”μ‚΄ν‘œ ν•¨μˆ˜

ES2015μ—μ„œ λ“±μž₯ν•œ λ¬Έλ²•μœΌλ‘œ, ν•¨μˆ˜ ν‘œν˜„μ‹λ³΄λ‹€ λ‹¨μˆœν•˜κ³  κ°„κ²°ν•œ λ¬Έλ²•μœΌλ‘œ ν•¨μˆ˜λ₯Ό λ§Œλ“œλŠ” 방법이닀.

νŠΉμ§•

  • function ν‚€μ›Œλ“œ μƒλž΅
  • 맀개 λ³€μˆ˜κ°€ ν•œ 개일 λ•Œ κ΄„ν˜Έ μƒλž΅
  • 맀개 λ³€μˆ˜κ°€ μ—†μœΌλ©΄ κ΄„ν˜Έλ§Œ μž‘μ„±
  • ν•¨μˆ˜ λͺΈμ²΄μ— 문이 ν•œ 개인 경우, μ€‘κ΄„ν˜Έ/return ν‚€μ›Œλ“œ μƒλž΅ κ°€λŠ₯
  • argument 객체와 this 바인딩을 ν•˜μ§€ μ•ŠμŒ
// 1. μΈμˆ˜κ°€ 2개
let sum = (a, b) => a + b;
alert(sum(1, 2));	// 3

// 2. μΈμˆ˜κ°€ 1개 : κ΄„ν˜Έ μƒλž΅
let double = n => n * 2;
alert(double(3));	// 6

// 3. μΈμˆ˜κ°€ μ—†μŒ : κ΄„ν˜Έλ§Œ
let sayHi = () => alert("Hi");
sayHi();

// 4. 본문이 μ—¬λŸ¬ 쀄 : μ€‘κ΄„ν˜Έ{}에 λͺΈμ²΄λ₯Ό λ„£μŒ
let sum = (a, b) => {
  let result = a + b;
  return result;
};

alert(sum(1,2));	// 3

 

μœ„μ—μ„œ μž‘μ„±ν•΄λ΄€λ˜ 읡λͺ…ν•¨μˆ˜λ„ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ λ§Œλ“€ 수 μžˆλ‹€.

ask {
  "λ™μ˜ν•˜μ‹­λ‹ˆκΉŒ?",
  () => alert("λ™μ˜ν–ˆμŠ΅λ‹ˆλ‹€.");
  () => alert("μ·¨μ†Œν–ˆμŠ΅λ‹ˆλ‹€.");
);

 

 

 

 

 

μ°Έκ³ 

더보기
λ°˜μ‘ν˜•

'Front-end > JavaScript' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

B11 : ν•¨μˆ˜ λ‚΄μž₯ λ©”μ„œλ“œ  (1) 2025.08.17
B10 : ν•¨μˆ˜μ˜ this ν‚€μ›Œλ“œ  (8) 2025.08.16
B8 : 반볡문  (2) 2025.08.14
[WIP] defer πŸ†š async πŸ†š DOMContentLoaded  (1) 2025.08.14
Undefined vs null vs NaN  (3) 2025.08.12