12.1 ν•¨μˆ˜λž€?

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


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

  • ν•¨μˆ˜λŠ” λͺ‡λ²ˆμ΄λ“  ν˜ΈμΆœν•  수 μžˆμœΌλ―€λ‘œ μ½”λ“œμ˜ μž¬μ‚¬μš©μ΄λΌλŠ” μΈ‘λ©΄μ—μ„œ 맀우 μœ μš©ν•˜λ‹€.
  • μ½”λ“œμ˜ 쀑볡을 μ–΅μ œν•˜κ³  μž¬μ‚¬μš©μ„±μ„ λ†’μ΄λŠ” ν•¨μˆ˜λŠ” μœ μ§€λ³΄μˆ˜μ˜ νŽΈμ˜μ„±μ„ 높이고 μ½”λ“œμ˜ 신뒰성을 높인닀.
  • ν•¨μˆ˜ 식별이름을 κΈ°κ°€λ§‰νžˆκ²Œ μ§€μœΌλ©΄ λ‚΄λΆ€ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜μ§€ μ•Šκ³ λ„ ν•¨μˆ˜μ˜ 역할을 νŒŒμ•…ν•  수 μžˆμ–΄ μ½”λ“œμ˜ 가독성을 ν–₯μƒμ‹œν‚¨λ‹€.

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

ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ˜ κ΅¬μ„±μš”μ†ŒλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • ν•¨μˆ˜μ΄λ¦„
  • λ§€κ°œλ³€μˆ˜ λͺ©λ‘
  • ν•¨μˆ˜ λͺΈμ²΄

ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ ν‰κ°€λ˜λŠ” 값을 μƒμ„±ν•˜λ©° ν•¨μˆ˜λŠ” 객체이닀. 일반 κ°μ²΄λŠ” ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ ν•¨μˆ˜λŠ” ν˜ΈμΆœν•  수 μžˆλ‹€.

12.4 ν•¨μˆ˜ μ •μ˜

ν•¨μˆ˜ μ •μ˜λ₯Ό μ •μ˜ν•˜λŠ” λ°©λ²•μ—λŠ” 4가지가 μžˆλ‹€.

  • ν•¨μˆ˜ μ„ μ–Έλ¬Έ
  • ν•¨μˆ˜ ν‘œν˜„μ‹
  • Function μƒμ„±μž ν•¨μˆ˜
  • ν™”μ‚΄ν‘œ ν•¨μˆ˜(ES6)

🧐 λ³€μˆ˜ μ„ μ–Έκ³Ό ν•¨μˆ˜ μ •μ˜

λ³€μˆ˜λŠ” μ„ μ–Έ(declaration) ν•œλ‹€κ³  ν–ˆμ§€λ§Œ ν•¨μˆ˜λŠ” μ •μ˜ (definitnion) ν•œλ‹€κ³  ν‘œν˜„ν–ˆλ‹€. ν•¨μˆ˜ 선언문이 ν‰κ°€λ˜λ©΄ μ‹λ³„μžκ°€ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λ˜κ³  ν•¨μˆ˜ 객체가 ν• λ‹Ήλœλ‹€.

12.4.1 ν•¨μˆ˜ μ„ μ–Έλ¬Έ

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

ν•¨μˆ˜ 선언문은 ν•¨μˆ˜ λ¦¬ν„°λŸ΄κ³Ό ν˜•νƒœκ°€ λ™μΌν•˜λ‹€. 단 ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μžˆμœΌλ‚˜ ν•¨μˆ˜ 선언문은 ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μ—†λ‹€.

ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이기 λ•Œλ¬Έμ— 이λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ™„λ£Œ κ°’ undefined κ°€ 좜λ ₯λœλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μƒμ„±λœ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄ ν•¨μˆ˜ 이름과 λ™μΌν•œ μ΄λ¦„μ˜ μ‹λ³„μžλ₯Ό

ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹ŒμΈ 문이닀.

12.4.2 ν•¨μˆ˜ ν‘œν˜„μ‹

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

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” κ°’μ²˜λŸΌ λ³€μˆ˜μ— ν• λ‹Ήν•  μˆ˜λ„ 있고, ν”„λ‘œνΌν‹°μ˜ 값이 될 μˆ˜λ„ 있으며 λ°°μ—΄μ˜ μš”μ†Œκ°€ 될 수 μžˆλŠ” 일급 객체이닀.

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν‘œν˜„μ‹μΈ 문이닀.

12.4.3 ν•¨μˆ˜ 생성 μ‹œμ κ³Ό ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜μ˜ 생성 μ‹œμ μ€ λ‹€λ₯΄λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λͺ¨λ“  선언문을 μ†ŒμŠ€μ½”λ“œμ—μ„œ μ°Ύμ•„λ‚΄ λ¨Όμ € μ‹€ν–‰ν•˜κ³  평가 ν•œλ‹€κ³  ν–ˆλ‹€. ν•¨μˆ˜ 선언문은 λ˜ν•œ β€œλ¬Έβ€μ΄κΈ° λ•Œλ¬Έμ— μ½”λ“œμ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€. 이λ₯Ό ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄λΌκ³  ν•œλ‹€.

var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ λ³€μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ 선언문은 λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ λ¨Όμ € μ‹€ν–‰λ˜μ–΄ μ‹λ³„μžλ₯Ό μƒμ„±ν•œλ‹€λŠ” μ μ—μ„œ λ™μΌν•˜μ§€λ§Œ, var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” undefined둜 μ΄ˆκΈ°ν™”λ˜κ³ , ν•¨μˆ˜ 선언문을 톡해 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ μ‹λ³„μžλŠ” ν•¨μˆ˜ 객체둜 μ΄ˆκΈ°ν™”λœλ‹€. λ”°λΌμ„œ var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 λ³€μˆ˜λ₯Ό μ°Έμ‘° ν•˜λ©΄ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ undefined둜 ν‰κ°€λ˜μ§€λ§Œ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λ₯Ό ν•¨μˆ˜ μ„ μ–Έλ¬Έ 이전에 ν˜ΈμΆœν•˜λ©΄ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ 호좜이 κ°€λŠ₯ν•˜λ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜μ— ν• λ‹Ήλ˜λŠ” 값이 ν•¨μˆ˜ λ¦¬ν„°λŸ΄μΈ λ¬Έμ΄λ―€λ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ©΄ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 것이 μ•„λ‹ˆλΌ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•œλ‹€.

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

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

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

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

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

ES6μ—μ„œ λ„μž…λœ ν™”μ‚΄ν‘œ ν•¨μˆ˜(arrow function)λŠ” function ν‚€μ›Œλ“œ λŒ€μ‹ μ— ν™”μ‚΄ν‘œ(β‡’)λ₯Ό μ‚¬μš©ν•΄ μ’€ 더 κ°„λž΅ν•œ λ°©λ²•μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€.

12.5 ν•¨μˆ˜ 호좜

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

  // ν•¨μˆ˜ μ„ μ–Έλ¬Έ
  function add(x, y) {
    return x + y;
  }

  // ν•¨μˆ˜ 호좜
  // 인수 1κ³Ό 2λŠ” λ§€κ°œλ³€μˆ˜ x와 y에 μˆœμ„œλŒ€λ‘œ ν• λ‹Ήλ˜κ³  ν•¨μˆ˜ λͺΈμ²΄μ˜ 문듀이 μ‹€ν–‰λœλ‹€.
  var result = add(1, 2);
  • 인수 : ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μ§€μ •ν•˜λ©°, κ°œμˆ˜μ™€ νƒ€μž…μ— μ œν•œμ΄ μ—†λ‹€.
  • λ§€κ°œλ³€μˆ˜ : ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ„ μ–Έν•˜λ©°, μŠ€μ½”ν”„(μœ νš¨λ²”μœ„)λŠ” ν•¨μˆ˜ 내뢀이닀.

12.5.2 인수 확인

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

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

  function add(x, y) {
    if (typeof x !== 'number' || typeof y !== 'number') {
      // λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 μ „λ‹¬λœ 인수의 νƒ€μž…μ΄ λΆ€μ μ ˆν•œ 경우 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
      throw new TypeError('μΈμˆ˜λŠ” λͺ¨λ‘ 숫자 값이어야 ν•©λ‹ˆλ‹€.');
    }

    return x + y;
  }

  console.log(add(2));        // TypeError: μΈμˆ˜λŠ” λͺ¨λ‘ 숫자 값이어야 ν•©λ‹ˆλ‹€.
  console.log(add('a', 'b')); // TypeError: μΈμˆ˜λŠ” λͺ¨λ‘ 숫자 값이어야 ν•©λ‹ˆλ‹€.

λ˜ν•œ μΈμˆ˜κ°€ μ „λ‹¬λ˜μ§€ μ•ŠλŠ” 경우 단좕평가λ₯Ό μ‚¬μš©ν•΄ λ§€κ°œλ³€μˆ˜μ— 기본값을 ν• λ‹Ήν•˜λŠ” 방법도 μžˆλ‹€.

  function add(a, b, c) {
    a = a || 0;
    b = b || 0;
    c = 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

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

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

λ§€κ°œλ³€μˆ˜λŠ” μˆœμ„œμ— μ˜λ―Έκ°€ μžˆλ‹€. λ”°λΌμ„œ λ§€κ°œλ³€μˆ˜κ°€ λ§Žμ•„μ§€λ©΄ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ 전달해야 ν•  인수의 μˆœμ„œλ₯Ό κ³ λ €ν•΄μ•Ό ν•œλ‹€. λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜κ°€ λ§Žλ‹€λŠ” 것은 ν•¨μˆ˜κ°€ μ—¬λŸ¬κ°€μ§€ 일을 ν•œλ‹€λŠ” μ¦κ±°μ΄λ―€λ‘œ λ°”λžŒμ§ν•˜μ§€ μ•Šλ‹€. 이상적인 ν•¨μˆ˜λŠ” ν•œ 가지 일만 ν•΄μ•Όν•˜λ©° 가급적 μž‘κ²Œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

12.5.4 λ°˜ν™˜λ¬Έ

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


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

  // λ§€κ°œλ³€μˆ˜ primitiveλŠ” μ›μ‹œκ°’μ„ 전달받고, λ§€κ°œλ³€μˆ˜ objλŠ” 객체λ₯Ό μ „λ‹¬λ°›λŠ”λ‹€.
  function changeVal(primitive, obj) {
    primitive += 100;
    obj.name = 'Kim';
  }

  // μ™ΈλΆ€ μƒνƒœ
  var num = 100;
  var person = { name: 'Lee' };

  console.log(num); // 100
  console.log(person); // {name: "Lee"}

  // μ›μ‹œκ°’μ€ κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λ˜κ³  κ°μ²΄λŠ” 참쑰값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€.
  changeVal(num, person);

  // μ›μ‹œκ°’μ€ 원본이 ν›Όμ†λ˜μ§€ μ•ŠλŠ”λ‹€.
  console.log(num); // 100

  // κ°μ²΄λŠ” 원본이 ν›Όμ†λœλ‹€.
  console.log(person); // {name: "Kim"}

μ›μ‹œ νƒ€μž… μΈμˆ˜λŠ” κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ–΄ λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ λͺΈμ²΄μ—μ„œ κ·Έ 값을 λ³€κ²½(μž¬ν• λ‹Ήμ„ ν†΅ν•œ ꡐ체)해도 원본은 ν›Όμ†λ˜μ§€ μ•ŠλŠ”λ‹€. λ‹€μ‹œ 말해, μ™ΈλΆ€ μƒνƒœ, 즉 ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ‘œ μ „λ‹¬ν•œ μ›μ‹œ κ°’μ˜ 원본을 λ³€κ²½ν•˜λŠ” μ–΄λ– ν•œ λΆ€μˆ˜νš¨κ³Όλ„ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

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

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

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

  (function () {
      var a = 3;
      var b = 5;
      return a*b;
  } ());

μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λž€ ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— μ¦‰μ‹œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό μ˜λ―Έν•˜λ©° λ‹€μ‹œ ν˜ΈμΆœν•  수 μ—†λ‹€. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ κ·Έλ£Ή μ—°μ‚°μž ( ... )둜 감싸야 ν•˜λ©°, 읡λͺ… ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.

12.7.2 μž¬κ·€ ν•¨μˆ˜

  // ν•¨μˆ˜ ν‘œν˜„μ‹
  var factorial = function foo(n) {
    // νƒˆμΆœ 쑰건: n이 1 μ΄ν•˜μΌ λ•Œ μž¬κ·€ ν˜ΈμΆœμ„ λ©ˆμΆ˜λ‹€.
    if (n <= 1) return 1;
    // ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžλ‘œ 자기 μžμ‹ μ„ μž¬κ·€ 호좜
    return n * factorial(n - 1);

    // ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ 자기 μžμ‹ μ„ μž¬κ·€ ν˜ΈμΆœν•  μˆ˜λ„ μžˆλ‹€.
    // console.log(factorial === foo); // true
    // return n * foo(n - 1);
  };

  console.log(factorial(5)); // 5! = 5 * 4 * 3 * 2 * 1 = 120

ν•¨μˆ˜κ°€ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” 것을 μž¬κ·€ 호좜(recursive call)이라 ν•œλ‹€. μž¬κ·€ ν•¨μˆ˜λŠ” μžμ‹ μ„ λ¬΄ν•œ 호좜 ν•˜λ―€λ‘œ μž¬κ·€ ν˜ΈμΆœμ„ 멈좜 수 μžˆλŠ” νƒˆμΆœ 쑰건을 λ°˜λ“œμ‹œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

12.7.3 쀑첩 ν•¨μˆ˜

  function outer() {
    var x = 1;

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

    inner();
  }

  outer();

ν•¨μˆ˜ 내뢀에 μ •μ˜λœ ν•¨μˆ˜λ₯Ό 쀑첩 ν•¨μˆ˜λΌκ³  ν•œλ‹€.

12.7.4 콜백 ν•¨μˆ˜

  // μ™ΈλΆ€μ—μ„œ 전달받은 fλ₯Ό n만큼 반볡 ν˜ΈμΆœν•œλ‹€
  function repeat(n, f) {
    for (var i = 0; i < n; i++) {
      f(i); // iλ₯Ό μ „λ‹¬ν•˜λ©΄μ„œ fλ₯Ό 호좜
    }
  }

  var logAll = function (i) {
    console.log(i);
  };

  // 반볡 ν˜ΈμΆœν•  ν•¨μˆ˜λ₯Ό 인수둜 μ „λ‹¬ν•œλ‹€.
  repeat(5, logAll); // 0 1 2 3 4

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

  // 반볡 ν˜ΈμΆœν•  ν•¨μˆ˜λ₯Ό 인수둜 μ „λ‹¬ν•œλ‹€.
  repeat(5, logOdds); // 1 3

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

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

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

12.7.5 순수 ν•¨μˆ˜μ™€ λΉ„μˆœμˆ˜ ν•¨μˆ˜

  var count = 0; // ν˜„μž¬ 카운트λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μƒνƒœ

  // 순수 ν•¨μˆ˜ increaseλŠ” λ™μΌν•œ μΈμˆ˜κ°€ μ „λ‹¬λ˜λ©΄ μ–Έμ œλ‚˜ λ™μΌν•œ 값을 λ°˜ν™˜ν•œλ‹€.
  function increase(n) {
    return ++n;
  }

  // 순수 ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ 결과값을 λ³€μˆ˜μ— μž¬ν• λ‹Ήν•΄μ„œ μƒνƒœλ₯Ό λ³€κ²½
  count = increase(count);
  console.log(count); // 1

  count = increase(count);
  console.log(count); // 2
  var count = 0; // ν˜„μž¬ 카운트λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μƒνƒœ: increase ν•¨μˆ˜μ— μ˜ν•΄ λ³€ν™”ν•œλ‹€.

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

  // λΉ„μˆœμˆ˜ ν•¨μˆ˜λŠ” μ™ΈλΆ€ μƒνƒœ(count)λ₯Ό λ³€κ²½ν•˜λ―€λ‘œ μƒνƒœ λ³€ν™”λ₯Ό μΆ”μ ν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€.
  increase();
  console.log(count); // 1

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

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

profile
μ΄μ‚¬μ€‘μž…λ‹ˆλ‹€!🌟https://velog.io/@devkyoung2

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보