🌸12μž₯. ν•¨μˆ˜

βœ…12.1 ν•¨μˆ˜λž€?

일련의 과정을 λ¬Έ(statement)으둜 κ΅¬ν˜„ν•˜κ³  μ½”λ“œ λΈ”λ‘μœΌλ‘œ κ°μ‹Έμ„œ ν•˜λ‚˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ μ •μ˜ν•œ 것
  • λ§€κ°œλ³€μˆ˜(parameter) : ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μž…λ ₯을 μ „λ‹¬λ°›λŠ” λ³€μˆ˜

  • 인수(argument) : μž…λ ₯

  • λ°˜ν™˜κ°’(return value): 좜λ ₯

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

  1. μ½”λ“œμ˜ μž¬μ‚¬μš©

    • λ™μΌν•œ μž‘μ—…μ„ 반볡적으둜 μˆ˜ν–‰ν•˜λŠ” μ½”λ“œλ₯Ό ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λŠ” 것이 νš¨μœ¨μ μ΄λ‹€.

  2. μœ μ§€λ³΄μˆ˜ νŽΈμ˜μ„± & μ½”λ“œμ˜ μ‹ λ’°μ„±

    • 같은 μ½”λ“œμ˜ μ€‘λ³΅μœΌλ‘œ μΈν•œ μˆ˜μ •μ— κ±Έλ¦¬λŠ” μ‹œκ°„κ³Ό μ‚¬λžŒμ˜ μ‹€μˆ˜λ₯Ό μ–΅μ œν•˜κ³  μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆλ‹€.

  3. μ½”λ“œμ˜ 가독성

    • ν•¨μˆ˜λŠ” 객체 νƒ€μž…μ˜ κ°’ 이닀. β†’ 이름(μ‹λ³„μž)λ₯Ό 뢙일 수 있음

    • μ μ ˆν•œ ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λ‚΄λΆ€ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜μ§€ μ•Šκ³ λ„ ν•¨μˆ˜μ˜ 역할을 νŒŒμ•…ν•  수 있게 돕고, μ΄λŠ” μ½”λ“œμ˜ 가독성을 ν–₯μƒμ‹œν‚¨λ‹€.

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

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

ν•¨μˆ˜λŠ” 객체(object)λ‹€.

  • ν•¨μˆ˜λŠ” 일반 κ°μ²΄μ™€λŠ” λ‹€λ₯΄λ‹€.

    • 일반 κ°μ²΄λŠ” ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ, ν•¨μˆ˜λŠ” ν˜ΈμΆœν•  수 μžˆλ‹€.

    • ν•¨μˆ˜λŠ” ν•¨μˆ˜ 객체만의 κ³ μœ ν•œ ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ”λ‹€.

βœ…12.2 ν•¨μˆ˜ μ •μ˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 방법은 총 4κ°€μ§€κ°€ μžˆλ‹€.
1. ν•¨μˆ˜ μ„ μ–Έλ¬Έ
2. ν•¨μˆ˜ ν‘œν˜„μ‹
3. Function μƒμ„±μž ν•¨μˆ˜
4. ν™”μ‚΄ν‘œ ν•¨μˆ˜

μ •μ˜λœ ν•¨μˆ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체가 λœλ‹€.

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

function add(x, y) {
    return x + y;
}
  • ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μžˆμ§€λ§Œ, ν•¨μˆ˜ 선언문은 ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μ—†λ‹€.

  • ν•¨μˆ˜μ„ μ–Έλ¬Έμ€ ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이닀. β†’ λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†λ‹€.

μ½”λ“œμ˜ λ¬Έλ§₯에 λ”°λ₯Έ μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ˜ ν•¨μˆ˜ 해석

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ½”λ“œ λ¬Έλ§₯에 따라 λ™μΌν•œ **ν•¨μˆ˜ λ¦¬ν„°λŸ΄**을 ν•¨μˆ˜ μ„ μ–Έλ¬Έ or ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ ν•΄μ„ν•œλ‹€.
  • β—ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이고, ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν‘œν˜„μ‹μΈ λ¬Έ

  • ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ΄ λ‹¨λ…μœΌλ‘œ μ‚¬μš©λ˜λŠ” 경우 β†’ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ 해석

  • ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ΄ κ°’μœΌλ‘œ ν‰κ°€λ˜μ–΄μ•Ό ν•˜λŠ”(λ³€μˆ˜μ— ν• λ‹Ή or ν”Όμ—°μ‚°μžλ‘œ..) λ¬Έλ§₯ β†’ ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹ 으둜 해석

🧐 ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” 것이 μ•„λ‹ˆλΌ ν•¨μˆ˜ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžλ‘œ ν˜ΈμΆœν•œλ‹€.

// 1️⃣ ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ ν•¨μˆ˜ 호좜
(function bar() {
    console.log("bar"); // ReferenceError: bar is not defined
});
bar();

// 2️⃣ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ ν•¨μˆ˜ 호좜
function foo() {
    console.log("foo"); // foo
}
foo();

ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλŠ” μ‹λ³„μž

  • ν•¨μˆ˜ λͺΈμ²΄ μ™ΈλΆ€μ—μ„œλŠ” ν•¨μˆ˜ 이름을 μ°Έμ‘°ν•  수 μ—†λ‹€.

  • 즉, ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžκ°€ μ—†λ‹€.

1️⃣ ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ 호좜 μ‹œ λ©”λͺ¨λ¦¬ ꡬ쑰

image

2️⃣ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ ν•¨μˆ˜ 호좜 μ‹œ λ©”λͺ¨λ¦¬ ꡬ쑰

image
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜ 선언문을 해석해 ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€.

  • μƒμ„±λœ ν•¨μˆ˜ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μœ νš¨ν•œ μ‹λ³„μžκ°€ ν•„μš”ν•˜λ‹€.

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

πŸ’‘ 결둠적으둜, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜ 선언문을 ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ λ³€ν™˜ β†’ ν•¨μˆ˜ 객체λ₯Ό 생성

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

ν•¨μˆ˜λŠ” 일급 κ°μ²΄μ΄λ―€λ‘œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ ν•¨μˆ˜ 객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆλ‹€.
β†’ ν•¨μˆ˜ ν‘œν˜„μ‹(function expression)
  • μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” κ°’μ²˜λŸΌ λ³€μˆ˜μ— ν• λ‹Ήν•  μˆ˜λ„ 있고 ν”„λ‘œνΌν‹° 값이 될 μˆ˜λ„ 있으며 λ°°μ—΄μ˜ μš”μ†Œκ°€ 될 μˆ˜λ„ μžˆλ‹€. 이처럼 κ°’μ˜ μ„±μ§ˆμ„ κ°–λŠ” 객체λ₯Ό 일급 객체라 ν•œλ‹€.

  • ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ˜ ν•¨μˆ˜ 이름은 μƒλž΅ν•  수 μžˆλ‹€. β†’ 읡λͺ… ν•¨μˆ˜

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

ν•¨μˆ˜ 선언문은 ν˜ΈμΆœν•  수 μžˆμ§€λ§Œ, ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν˜ΈμΆœν•  수 μ—†λ‹€.
=> "생성 μ‹œμ "이 λ‹€λ₯΄κΈ° λ•Œλ¬Έ
// ν•¨μˆ˜ μ°Έμ‘°
console.dir(add); // [Function: add]
console.dir(sub); // undefined

// ν•¨μˆ˜ 호좜
console.log(add(2, 5)); // 7
console.log(sub(2, 5)); // TypeError: sub is not a function

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

// ν•¨μˆ˜ ν‘œν˜„μ‹
var sub = function (x, y) {
    return x - y;
};

ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… : ν•¨μˆ˜ 선언문이 μ½”λ“œμ˜ μ„ λ‘λ‘œ μ˜¬λ €μ§„ 것 처럼 λ™μž‘ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 고유의 νŠΉμ§•

  • ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ©΄ λŸ°νƒ€μž„ 이전에 ν•¨μˆ˜ 객체가 λ¨Όμ € μƒμ„±λœλ‹€.

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

  • 즉, λŸ°νƒ€μž„μ—λŠ” 이미 ν•¨μˆ˜ 객체가 μƒμ„±λ˜μ–΄ 있고 ν•¨μˆ˜ 이름과 λ™μΌν•œ μ‹λ³„μžμ— ν• λ‹ΉκΉŒμ§€ μ™„λ£Œλœ μƒνƒœμ΄λ‹€.

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

  • λ”°λΌμ„œ, ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜ μ„ μ–Έλ¬Έκ³Ό λ³€μˆ˜ 할당문을 ν•œ λ²ˆμ— κΈ°μˆ ν•œ μΆ•μ•½ ν‘œν˜„κ³Ό λ™μΌν•˜κ²Œ λ™μž‘.

  • λ³€μˆ˜ ν• λ‹Ήλ¬Έμ˜ 값은 λŸ°νƒ€μž„(할당문이 μ‹€ν–‰λ˜λŠ” μ‹œμ )에 ν‰κ°€λ˜λ―€λ‘œ

    β‡’ ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ„ λŸ°νƒ€μž„μ— ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체가 λœλ‹€.

  • λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ… vs ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… 곡톡점

    • λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ λ¨Όμ € μ‹€ν–‰λ˜μ–΄ μ‹λ³„μžλ₯Ό μƒμ„±ν•œλ‹€. 차이점

    • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” undefined둜 μ΄ˆκΈ°ν™”

    • ν•¨μˆ˜ 선언문을 톡해 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ μ‹λ³„μžλŠ” ν•¨μˆ˜ 객체둜 μ΄ˆκΈ°ν™” β‡’ ν•¨μˆ˜ μ„ μ–Έλ¬Έ 이전에도 호좜 κ°€λŠ₯ feat.ν˜Έμ΄μŠ€νŒ…

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

const add = (x, y) => x + y;
console.log(add(1, 2));
  • function ν‚€μ›Œλ“œ λŒ€μ‹  ν™”μ‚΄ν‘œ β‡’ λ₯Ό μ‚¬μš©ν•΄ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€.

  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 항상 읡λͺ…ν•¨μˆ˜λ‘œ μ •μ˜ν•œλ‹€.

βœ…12.3 ν•¨μˆ˜ 호좜

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

  • ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 값을 ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ λ‚΄λΆ€λ‘œ μ „λ‹¬ν• λ•Œ, λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 인수λ₯Ό μ „λ‹¬ν•œλ‹€.

  • ν•¨μˆ˜κ°€ 호좜되면 : ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œ μ•”λ¬΅μ μœΌλ‘œ λ§€κ°œλ³€μˆ˜κ°€ μƒμ„±λ˜κ³  undefined둜 μ΄ˆκΈ°ν™”λœ 이후 μΈμˆ˜κ°€ μˆœμ„œλŒ€λ‘œ ν• λ‹Ήλœλ‹€.

  • ν•¨μˆ˜λŠ” λ§€κ²¨λ³€μˆ˜μ˜ κ°œμˆ˜μ™€ 인수(argument)의 κ°œμˆ˜κ°€ μΌμΉ˜ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

    • 인수 < λ§€κ°œλ³€μˆ˜ : λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜μ— λŒ€ν•΄μ„œλŠ” μ•”λ¬΅μ μœΌλ‘œ undefined

    • 인수 > λ§€κ°œλ³€μˆ˜ : λͺ¨λ“  μΈμˆ˜λŠ” μ•”λ¬΅μ μœΌλ‘œ arguments 객체에 ν”„λ‘œνΌν‹°λ‘œ λ³΄κ΄€λœλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ λ¬Έλ²•μƒμ˜ 문제

1️⃣ μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ™€ 인수의 κ°œμˆ˜κ°€ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜μ§€ μ•ŠλŠ”λ‹€.
2οΈβƒ£Β μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” "동적 νƒ€μž… μ–Έμ–΄"λ‹€. => μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ "νƒ€μž…μ„ 사전에 μ§€μ •ν•  수 μ—†λ‹€."

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

  1. typeofμ—°μ‚°μž μ‚¬μš©ν•΄μ„œ 인수 νƒ€μž… κ²€μ‚¬ν•˜κΈ°

  2. 정적 νƒ€μž… 선언이 κ°€λŠ₯ν•œ Typescript μ‚¬μš©ν•˜κΈ°

  3. μΈμˆ˜κ°€ μ „λ‹¬λ˜μ§€ μ•Šμ€ 경우 단좕평가λ₯Ό μ‚¬μš©ν•΄ κΈ°λ³Έκ°’ ν• λ‹Ή

  4. λ§€κ°œλ³€μˆ˜μ— κΈ°λ³Έκ°’(default value) 을 ν• λ‹Ήν•˜κΈ°

    β†’ ν•¨μˆ˜ λ‚΄μ—μ„œ μˆ˜ν–‰ν•˜λ˜ 인수 체크 및 μ΄ˆκΈ°ν™” κ°„μ†Œν™”ν•  수 μžˆλ‹€.

// 1. typeof μ—°μ‚°μžλ‘œ 인수 νƒ€μž… κ²€μ‚¬ν•˜κΈ°
function add(x, y) {
    if (typeof x !== "number" || typeof y !== "number") {
        throw new TypeError("μΈμˆ˜λŠ” λͺ¨λ‘ 숫자(number)κ°’ 이어야 ν•©λ‹ˆλ‹€.");
    }
    return x + y;
}

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

// 3. 단좕평가 μ‚¬μš©ν•˜κΈ°
function mul(a, b, c) {
    a = a || 1;
    b = b || 1;
    c = c || 1;

    return a * b * c;
}
console.log(mul(1, 2, 3)); // 6
console.log(mul(1, 2)); // 2
console.log(mul(1)); // 1
console.log(mul()); // 1

// 4. λ§€κ°œλ³€μˆ˜ κΈ°λ³Έκ°’ μ‚¬μš©ν•˜κΈ°
function sub(a = 0, b = 0) {
    return a - b;
}
console.log(sub(10, 9)); // 1
console.log(sub(10)); // 10
console.log(sub()); // 0

λ°˜ν™˜λ¬Έ

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

ν•¨μˆ˜ ν˜ΈμΆœμ€ ν‘œν˜„μ‹μ΄λ‹€.
πŸ‘‰ "ν•¨μˆ˜ 호좜 ν‘œν˜„μ‹μ€ return ν‚€μ›Œλ“œκ°€ λ°˜ν™˜ν•œ ν‘œν˜„μ‹μ˜ 평가 κ²°κ³Ό(λ°˜ν™˜κ°’)으둜 ν‰κ°€λœλ‹€."
  1. λ°˜ν™˜λ¬Έμ€ ν•¨μˆ˜μ˜ 싀행을 μ€‘λ‹¨ν•˜κ³  ν•¨μˆ˜ λͺΈμ²΄λ₯Ό λΉ μ Έλ‚˜κ°„λ‹€.

  2. λ°˜ν™˜λ¬Έμ€ return ν‚€μ›Œλ“œ 뒀에 μ˜€λŠ” ν‘œν˜„μ‹μ„ 평가해 λ°˜ν™˜ν•œλ‹€.

    • return ν‚€μ›Œλ“œ 뒀에 λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  ν‘œν˜„μ‹μ„ λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ undefinedκ°€ λ°˜ν™˜λœλ‹€.

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

값에 μ˜ν•œ 호좜과 참쑰에 μ˜ν•œ 호좜

  • 값에 μ˜ν•œ 호좜(call by value) : ν•¨μˆ˜ ν˜ΈμΆœμ‹œ λ§€κ°œλ³€μˆ˜μ— μ›μ‹œ κ°’(primitive value)을 전달

    • μ›μ‹œ νƒ€μž…μ˜ 인수(argument)λŠ” κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ–΄ λ§€κ°œλ³€μˆ˜μ— 전달

    • ν•΄λ‹Ή 값을 변경해도 원본이 ν›Όμ†λ˜μ§€ μ•ŠλŠ”λ‹€. (side effect X)

  • 참쑰에 μ˜ν•œ 호좜(call by reference) : ν•¨μˆ˜ ν˜ΈμΆœμ‹œ λ§€κ°œλ³€μˆ˜μ— 객체(object) λ₯Ό 전달

    • 객체 νƒ€μž… 인수(argument) λŠ” μ°Έμ‘° 값이 λ³΅μ‚¬λ˜μ–΄ λ§€κ°œλ³€μˆ˜μ— 전달

    • μ°Έμ‘° 값을 톡해 μ „λ‹¬ν•œ 객체λ₯Ό λ³€κ²½ν•  경우 원본이 ν›Όμ†λœλ‹€. ( side effect O )

function changeVal(primitive, obj) {
    primitive += 100;
    obj.name = "Kwak";
}

var num = 100;
var person = { name: "KKKK" };

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

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

console.log(num); // 100
console.log(person); // { name: 'Kwak' } πŸ§μ›λ³Έ 훼손

참쑰에 μ˜ν•œ 호좜의 문제점

객체가 변경될 수 있기 λ•Œλ¬Έμ— "μƒνƒœ λ³€ν™” 좔적"이 μ–΄λ ΅λ‹€.

해결방법 쀑 ν•˜λ‚˜λŠ” 객체λ₯Ό λΆˆλ³€ 객체(immutable object)둜 λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λŠ” 것이닀.

  • 객체의 볡사본을 μƒˆλ‘­κ²Œ μƒμ„±ν•˜λŠ” 것은 λΉ„μš©(cost)이 원본 객체 규λͺ¨μ— 따라 컀질 수 μžˆλ‹€.

  • ν•˜μ§€λ§Œ, 객체λ₯Ό 마치 μ›μ‹œ κ°’μ²˜λŸΌ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’μœΌλ‘œ λ™μž‘ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

  • 변경이 ν•„μš”ν•œ 경우 : κΉŠμ€ 볡사(deep copy)λ₯Ό 톡해 μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜κ³  μž¬ν• λ‹Ήν•œλ‹€. (side effect X)

μˆœμˆ˜ν•¨μˆ˜

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

  • 순수 ν•¨μˆ˜λ₯Ό 톡해 side effectλ₯Ό μ΅œλŒ€ν•œ μ–΅μ œν•˜μ—¬ 였λ₯˜λ₯Ό ν”Όν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ 높인닀. β‡’ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

βœ…12.5 λ‹€μ–‘ν•œ ν•¨μˆ˜μ˜ ν˜•νƒœ

μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜(IIFE, Immediately Invoked Function Expression)

  • ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— μ¦‰μ‹œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜

  • 읡λͺ… ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.

  • λ°˜λ“œμ‹œ κ·Έλ£Ή μ—°μ‚°μž( ... )둜 감싸야 ν•œλ‹€.

// μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ - 일반적인 방식
(function () {
    /// ...
})();

// ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ„ ν‰κ°€ν•΄μ„œ ν•¨μˆ˜ 객체λ₯Ό 생성할 수 μžˆλ‹€λ©΄, κ·Έλ£Ή μ—°μ‚°μž μ΄μ™Έμ˜ μ—°μ‚°μž μ‚¬μš© κ°€λŠ₯
!(function () {
    /// ...
})();

μž¬κ·€ν•¨μˆ˜(recursive function)

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

  • ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œλ§Œ μœ νš¨ν•˜κΈ° λ•Œλ¬Έμ—, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” ν•¨μˆ˜ 이름을 μ΄μš©ν•΄ 자기 μžμ‹ μ„ ν˜ΈμΆœν•  수 μžˆλ‹€.

  • νƒˆμΆœμ‘°κ±΄μ„ λ°˜λ“œμ‹œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. μ—†μœΌλ©΄ μŠ€νƒ μ˜€λ²„ν”Œλ‘œ μ—λŸ¬ λ°œμƒ

쀑첩 ν•¨μˆ˜(nested function) == λ‚΄λΆ€ ν•¨μˆ˜(inner function)

  • ν•¨μˆ˜ 내뢀에 μ •μ˜λœ ν•¨μˆ˜

  • 쀑첩 ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€.

    • μ™ΈλΆ€ ν•¨μˆ˜(outer function) : 쀑첩 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜

  • 쀑첩 ν•¨μˆ˜λŠ” μžμ‹ μ„ ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό λ•λŠ” 헬퍼 ν•¨μˆ˜(helper function)역할을 ν•œλ‹€.

function outer() {
    var x = 1;

    // 쀑첩 ν•¨μˆ˜ == λ‚΄λΆ€ ν•¨μˆ˜
    function inner() {
        var y = 2;

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

콜백 ν•¨μˆ˜(callback function)

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

  • 콜백 ν•¨μˆ˜λŠ” κ³ μ°¨ ν•¨μˆ˜μ— μ˜ν•΄ ν˜ΈμΆœλœλ‹€.

    • κ³ μ°¨ ν•¨μˆ˜(Higher-Order Function, HOF) : λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜μ˜ μ™ΈλΆ€μ—μ„œ 콜백 ν•¨μˆ˜λ₯Ό 전달받은 ν•¨μˆ˜

  • κ³ μ°¨ ν•¨μˆ˜λŠ” ν•„μš”μ— 따라 콜백 ν•¨μˆ˜μ— 인수(argument)λ₯Ό 전달할 수 μžˆλ‹€. β†’ κ³ μ°¨ν•¨μˆ˜μ— μ½œλ°±ν•¨μˆ˜ 전달 μ‹œ 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šκ³  ν•¨μˆ˜ 자체λ₯Ό 전달해야 ν•œλ‹€.

  • ν•¨μˆ˜λŠ” 일급 객체 μ΄λ―€λ‘œ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜λ₯Ό 전달 κ°€λŠ₯ β‡’ ν•¨μˆ˜λŠ” 더 이상 λ‚΄λΆ€λ‘œμ§μ— κ°•λ ₯히 μ˜μ‘΄ν•˜μ§€ μ•Šκ³  μ™ΈλΆ€μ—μ„œ 둜직의 일뢀뢄을 ν•¨μˆ˜λ‘œ 전달받아 μˆ˜ν–‰ν•˜λ―€λ‘œ μœ μ—°ν•œ ꡬ쑰λ₯Ό κ°–λŠ”λ‹€.

// μ™ΈλΆ€μ—μ„œ 전달받은 func λ₯Ό n 만큼 반볡 호좜 - κ³ μ°¨ ν•¨μˆ˜ repeat
function repeat(n, f) {
    for (var i = 0; i < n; i++) {
        f(i);
    }
}

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

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

// 콜백 ν•¨μˆ˜ μ •μ˜ - logOdd
var logOdd = function (i) {
    if (i % 2) console.log(i);
};

// 반볡 ν˜ΈμΆœν•  ν•¨μˆ˜λ₯Ό 인수둜 전달
repeat(5, logOdd); // 1 3

Last updated