[JS] ํ•จ์ˆ˜

icebearยท2023๋…„ 12์›” 1์ผ

๐Ÿ“Œํ•จ์ˆ˜๋ž€

ํ•จ์ˆ˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•ต์‹ฌ์ด๋‹ค. ํ•จ์ˆ˜ ๋ง๊ณ  ๋‹ค๋ฅธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ธ ์Šค์ฝ”ํ”„, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ , ํด๋กœ์ € , ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ , ๋ฉ”์„œ๋“œ , this , ํ”„๋กœํ† ํƒ€์ž… , ๋ชจ๋“ˆํ™” ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋…์ด ํ•จ์ˆ˜์™€ ๊นŠ์€ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ๊ฐœ๋…์ด์ž ํ•ต์‹ฌ๊ฐœ๋…์ธ ํ•จ์ˆ˜๋ฅผ ์ž˜ ์•Œ์•„์•ผํ•œ๋‹ค
ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ถœ๋ ฅ์„ ๋‚ด๋ณด๋‚ด๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ์ •์˜ํ•œ ๊ฒƒ์ด๋‹ค

๋‹ค์Œ ์˜ˆ์ œ๋Š” f(x, y) = x + y๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค

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

// f(2, 5) = 7
add(2, 5); // 7

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ•จ์ˆ˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ๋ฌธ(statement)์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์ฝ”๋“œ ๋ธ”๋ก์œผ๋กœ ๊ฐ์‹ธ์„œ ํ•˜๋‚˜์˜ ์‹คํ–‰ ๋‹จ์œ„๋กœ ์ •์˜ํ•œ ๊ฒƒ์ด๋‹ค.
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ•จ์ˆ˜๋„ ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ์ถœ๋ ฅ์„ ๋‚ด๋ณด๋‚ธ๋‹ค. ์ด๋•Œ
ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ์ž…๋ ฅ์„ ์ „๋‹ฌ๋ฐ›๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ž…๋ ฅ์„ ์ธ์ˆ˜ , ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜๊ฐ’์ด๋ผ๊ณ  ํ•œ๋‹ค ๋˜ํ•œ ํ•จ์ˆ˜๋Š” ๊ฐ’์œผ๋กœ์จ ์ทจ๊ธ‰์ด ๋œ๋‹ค.(์ผ๊ธ‰๊ฐ์ฒด์˜ ํŠน์ง•)

๋‹ค์Œ ์˜ˆ์ œ๋Š” ํ•จ์ˆ˜์˜ ์ •์˜์™€ ํ˜ธ์ถœ์„ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

// ํ•จ์ˆ˜ ์ •์˜
function add(x, y) {
  return x + y;
}

// ํ•จ์ˆ˜ ํ˜ธ์ถœ
var result = add(2, 5);

// ํ•จ์ˆ˜ add์— ์ธ์ˆ˜ 2, 5๋ฅผ ์ „๋‹ฌํ•˜๋ฉด์„œ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐ˜ํ™˜๊ฐ’ 7์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
console.log(result); // 7

ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์ •์˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ๋‹ค ํ•˜์ง€๋งŒ ํ•จ์ˆ˜๋Š” ์ •์˜๋งŒ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
์ธ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋ฉด์„œ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์‹œํ•ด์•ผ ํ•œ๋‹ค.
์ด๋ฅผ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ผ๊ณ  ํ•œ๋‹ค.


๐Ÿ“Œํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์— ์œ ์šฉ
  • ์œ ์ง€๋ณด์ˆ˜์˜ ํŽธ์˜์„ฑ์„ ๋†’์ž„
  • ์ฝ”๋“œ์˜ ์‹ ๋ขฐ์„ฑ์„ ๋†’์ž„
  • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ

๐Ÿ“Œํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด ํƒ€์ž…์˜ ๊ฐ’์ด๋‹ค.
๋”ฐ๋ผ์„œ ์ˆซ์ž ๊ฐ’์„ ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ•จ์ˆ˜๋„ ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
(ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด === ํ•จ์ˆ˜ ํ‘œํ˜„์‹)

ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ

  • function ํ‚ค์›Œ๋“œ
  • ํ•จ์ˆ˜์ด๋ฆ„
  • ๋งค๊ฐœ๋ณ€์ˆ˜
  • ํ•จ์ˆ˜ ๋ชธ์ฒด

ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” ๋‹ค์Œ ํ‘œ์™€ ๊ฐ™๋‹ค
ํ•จ์ˆ˜๋ฆฌํ„ฐ๋Ÿด ํ‘œ

ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์€ ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ๊ธฐ๋ฒ•์ด๋‹ค.
ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์€ ํ‰๊ฐ€๋˜์–ด ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ณ , ์ด ๊ฐ’์€ ๊ฐ์ฒด๋‹ค.
ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด๋‹ค.

ํ•˜์ง€๋งŒ ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅด๋‹ค.
์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์ง€๋งŒ, ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“Œํ•จ์ˆ˜์ •์˜

ํ•จ์ˆ˜ ์ •์˜๋ž€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ด์ „์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ํ•  ๋ฌธ๋“ค, ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜ํ™˜ํ•  ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
์ •์˜๋œ ํ•จ์ˆ˜๋Š” ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

ํ•จ์ˆ˜์˜ ์ •์˜ ๋ฐฉ๋ฒ•
ํ•จ์ˆ˜ ์ •์˜ ๋ฐฉ๋ฒ•


ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ

// ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
function add(x, y) {
  return x + y;
}

// ํ•จ์ˆ˜ ์ฐธ์กฐ
// console.dir์€ console.log์™€๋Š” ๋‹ฌ๋ฆฌ ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊นŒ์ง€ ์ถœ๋ ฅํ•œ๋‹ค.
// ๋‹จ, Node.js ํ™˜๊ฒฝ์—์„œ๋Š” console.log์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
console.dir(add); // ฦ’ add(x, y)

// ํ•จ์ˆ˜ ํ˜ธ์ถœ
console.log(add(2, 5)); // 7

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๊ณผ ํ˜•ํƒœ๊ฐ€ ๋™์ผํ•˜๋‹ค.
ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์€ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ํ‘œํ˜„์‹์ด ์•„๋‹Œ ๋ฌธ์ด๋‹ค.
ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ์ฝ˜์†”์—์„œ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด ์™„๋ฃŒ๊ฐ’undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ‘œํ˜„์‹์ด ํ‰๊ฐ€๋˜์–ด ์ƒ์„ฑ๋œ ํ•จ์ˆ˜๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.


ํ•จ์ˆ˜ ํ‘œํ˜„์‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด์ด๋‹ค.
์ผ๊ธ‰ ๊ฐ์ฒด๋Š” ๊ฐ’์ฒ˜๋Ÿผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ , ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๋ฐฐ์—ด์˜ ์š”์†Œ๋„ ๋  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์˜ ์ •์˜ ๋ฐฉ์‹์„ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด๋ผ๊ณ  ํ•œ๋‹ค.

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹
var add = function (x, y) {
  return x + y;
};

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

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ‘œํ˜„์‹์˜ ์ฐจ์ด

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ฐจ์ด

  • ์„ ์–ธ๋ฌธ์€ ์ด๋ฆ„์„ ์ƒ๋žตํ• ์ˆ˜ ์—†์ง€๋งŒ ํ‘œํ˜„์‹์€ ์ด๋ฆ„์„ ์ƒ๋žตํ• ์ˆ˜ ์žˆ๋‹ค.

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋ณ€์ˆ˜๋ฅผ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ์–ด ๋”ฐ๋กœ ํ•จ์ˆ˜ ์ด๋ฆ„์ด ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • ํ˜ธ์ด์ŠคํŒ…์˜ ์ฐจ์ด
    ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ์ฝ”๋“œ(ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์„ ํฌํ•จํ•œ) ํ‰๊ฐ€ ๋‹จ๊ณ„์—์„œ ํ•จ์ˆ˜ ๊ฐ์ฒด ์ƒ์„ฑ.
    ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ์ฝ”๋“œ(ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ํฌํ•จํ•œ) ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ ํ•จ์ˆ˜ ๊ฐ์ฒด ์ƒ์„ฑ.

โ—ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ… vs ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…
varํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์—”์ง„์— ์˜ํ•ด ๋จผ์ € ์‹คํ–‰๋˜์–ด ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ ์€ ๋™์ผํ•˜๋‹ค.

ํ•˜์ง€๋งŒ, varํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” undefined๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ , ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค.
๋”ฐ๋ผ์„œ, varํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ฌธ ์ด์ „์— ์ฐธ์กฐํ•˜๋ฉด undefined๋กœ ํ‰๊ฐ€๋˜์ง€๋งŒ, ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์— ์˜ํ•ด ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โ€ปํ•จ์ˆ˜ ํ‘œํ˜„์‹
ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜๋Š” ๊ฐ’์ด ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด. ์ฆ‰, ๋ฌธ์ด๋‹ค.
๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ• ๋‹น๋ฌธ์„ ํ•œ๋ฒˆ์— ๊ธฐ์ˆ ํ•œ ํ‘œํ˜„๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
๋ณ€์ˆ˜ ์„ ์–ธ์€ ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์‹คํ–‰๋˜์–ด undefined๋กœ ์ดˆ๊ธฐํ™” ๋˜๊ณ , ๋ณ€์ˆ˜ ํ• ๋‹น๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ , ์ฆ‰ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์ด ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๋ณ€์ˆ˜ ํ• ๋‹น๋ฌธ์˜ ๊ฐ’์ด ๋˜์–ด ํ• ๋‹น๋œ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒ๋˜์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…๋งŒ ๋ฐœ์ƒ๋œ๋‹ค.


Function ์ƒ์„ฑ์ž ํ•จ์ˆ˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” ๋นŒํŠธ์ธ ํ•จ์ˆ˜์ธ Function ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก๊ณผ ํ•จ์ˆ˜ ๋ชธ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌํ•˜๋ฉด์„œ new์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.new์—ฐ์‚ฐ์ž ์—†์ด ํ˜ธ์ถœํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค

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

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

Function์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค ์ด์œ ๋Š” ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค ๋˜ํ•œ
ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด๋‚˜ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ƒ์„ฑํ•œ ํ•จ์ˆ˜์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.


ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

ES6์—์„œ ๋„์ž…๋œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” functionํ‚ค์›Œ๋“œ ๋Œ€์‹  ํ™”์‚ดํ‘œ=>๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋žตํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ์ต๋ช…ํ•จ์ˆ˜๋กœ ์ •์˜ํ•œ๋‹ค.

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
const add = (x, y) => x + y;
console.log(add(2, 5)); // 7

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ๊ธฐ์กด์˜ ํ•จ์ˆ˜๋ณด๋‹ค ํ‘œํ˜„๋งŒ ๊ฐ„๋žตํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‚ด๋ถ€ ๋™์ž‘ ๋˜ํ•œ ๊ฐ„๋žตํ™”๋˜์–ด ์žˆ๋‹ค.

  • this ๋ฐ”์ธ๋”ฉ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค

  • prototype ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๋‹ค

  • arguments ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค


๐Ÿ“Œํ•จ์ˆ˜ ํ˜ธ์ถœ

ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž์™€ ํ•œ ์Œ์˜ ์†Œ๊ด„ํ˜ธ()์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž๋กœ ํ˜ธ์ถœํ•œ๋‹ค.
ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ˜„์žฌ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ์ค‘๋‹จํ•˜๊ณ  ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋กœ ์‹คํ–‰ ํ๋ฆ„์„ ์˜ฎ๊ธด๋‹ค. ์ด๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ธ์ˆ˜๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ํ• ๋‹น๋˜๊ณ  ํ•จ์ˆ˜ ๋ชธ์ฒด์˜ ๋ฌธ๋“ค์ด ์‹คํ–‰๋˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

// ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
function add(x, y) {
  return x + y;
}

// ํ•จ์ˆ˜ ํ˜ธ์ถœ
// ์ธ์ˆ˜ 1๊ณผ 2๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ x์™€ y์— ์ˆœ์„œ๋Œ€๋กœ ํ• ๋‹น๋˜๊ณ  ํ•จ์ˆ˜ ๋ชธ์ฒด์˜ ๋ฌธ๋“ค์ด ์‹คํ–‰๋œ๋‹ค.
let result = add(1, 2);

ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์ด๋‹ค.
๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ๋ฐ–์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค

function add(x, y) {
  console.log(x, y); // 2 5
  return x + y;
}

add(2, 5);

// add ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ x, y๋Š” ํ•จ์ˆ˜ ๋ชธ์ฒด ๋‚ด๋ถ€์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
console.log(x, y); // ReferenceError: x is not defined

ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜์™€ ์ธ์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
์ธ์ˆ˜๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ํ• ๋‹น๋˜์ง€ ์•Š์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” undefined์ด๊ณ  ๋„˜์น˜๋Š” ๊ฒฝ์šฐ ๋ฌด์‹œ๋œ๋‹ค. ์ดˆ๊ณผ๋˜๋Š”๊ฒฝ์šฐ ๋ฒ„๋ ค์ง€๋Š”๊ฒƒ์€ ์•„๋‹ˆ๊ณ  arguments๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋ณด๊ด€๋œ๋‹ค.

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

console.log(add(2)); // NaN = 2 + undefined
console.log(add(2,3,4)) // 5

// ์ดˆ๊ณผ๋Š” ๋ฒ„๋ ค์ง€์ง€ ์•Š๊ณ  ๋ณด๊ด€๋œ๋‹ค.
function add(x, y) {
  console.log(arguments);
  // Arguments(3) [2, 5, 10, callee: ฦ’, Symbol(Symbol.iterator): ฦ’]

  return x + y;
}

add(2, 5, 10);

์ธ์ˆ˜ ํ™•์ธ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ธ์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์  ํƒ€์ž… ์–ธ์–ด๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์‚ฌ์ „์— ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค.

์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์ ์ ˆํ•œ ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•˜๋‹ค.

  1. typeof๋กœ ํ™•์ธํ•˜๋Š”๋ฐฉ๋ฒ•
    ๋Ÿฐํƒ€์ž„์—์„œ๋งŒ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•œ ๋‹จ์ ์ด ์žˆ๋‹ค
    ๊ทธ๋ž˜์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ™์€ ์ •์  ํƒ€์ž…์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์œ„ ํ™•์žฅ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
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: ์ธ์ˆ˜๋Š” ๋ชจ๋‘ ์ˆซ์ž ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.๋‹จ์ถ•ํ‰๊ฐ€๋ฅผ ํ™œ์šฉํ•ด ๊ธฐ๋ณธ๊ฐ’ ํ• ๋‹น

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

3.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

๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜

  • ECMAScript ์‚ฌ์–‘์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ œํ•œํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋Š” 0๊ฐœ ์ด๋‹ค.
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ˆœ์„œ์— ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.
  • ๊ฐœ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋‚˜๋น ์ง„๋‹ค.
  • ์ตœ๋Œ€ 3๊ฐœ ์ด์ƒ์„ ๋„˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
  • ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค.

jQuery์˜ ajax์— ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ

$.ajax({
  method: 'POST',
  url: '/user',
  data: { id: 1, name: 'Lee' },
  cache: false
});

ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์™ธ๋ถ€์˜ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒ๋˜๋‹ˆ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.


๋ฐ˜ํ™˜๋ฌธ

ํ•จ์ˆ˜๋Š”returnํ‚ค์›Œ๋“œ์™€ ํ‘œํ˜„์‹(๋ฐ˜ํ™˜๊ฐ’)์œผ๋กœ ์ด๋ค„์ง„ ๋ฐ˜ํ™˜๋ฌธ์„ ์‚ฌ์šฉํ•ด ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํ•จ์ˆ˜ ์™ธ๋ถ€๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

function multiply(x, y) {
  return x * y; // ๋ฐ˜ํ™˜๋ฌธ
}

// ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.
let result = multiply(3, 5);
console.log(result); // 15

ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ํ‘œํ˜„์‹์ด๋‹ค.
ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ returnํ‚ค์›Œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ํ‘œํ˜„์‹์˜ ํ‰๊ฐ€ ๊ฒฐ๊ณผ, ์ฆ‰ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.

๋ฐ˜ํ™˜๋ฌธ์˜ ์—ญํ™œ

  • ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๊ณ  ํ•จ์ˆ˜ ๋ชธ์ฒด๋ฅผ ๋น ์ ธ๋‚˜๊ฐ„๋‹ค.
  • returnํ‚ค์›Œ๋“œ ๋’ค์— ์˜ค๋Š” ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ return์— ํ‘œํ˜„์‹์ด ์—†์œผ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • ๋ฐ˜ํ™˜๋ฌธ(return)์„ ์ƒ๋žตํ•ด๋„ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • ๋ฐ˜ํ™˜๋ฌธ์€ ํ•จ์ˆ˜ ๋ชธ์ฒด ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
  • return ํ‚ค์›Œ๋“œ์™€ ํ‘œํ˜„์‹ ์‚ฌ์ด์— ์ค„๋ฐ”๊ฟˆ์ด ์žˆ์„์‹œ ์„ธ๋ฏธ์ฝœ๋ก  ์ž๋™ ์‚ฝ์ž… ๊ธฐ๋Šฅ์œผ๋กœ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค
function multiply(x, y) {
  return x * y; // ๋ฐ˜ํ™˜๋ฌธ
  // 1.๋ฐ˜ํ™˜๋ฌธ ์ดํ›„์— ๋‹ค๋ฅธ ๋ฌธ์ด ์กด์žฌํ•˜๋ฉด ๊ทธ ๋ฌธ์€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋ฌด์‹œ๋œ๋‹ค.
  console.log('์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.');
}

console.log(multiply(3, 5)); // 15

// 2.ํ‘œํ˜„์‹์ด ์—†์œผ๋ฉด undefined ๋ฐ˜ํ™˜ํ•œ๋‹ค
function foo () {
  return;
}

console.log(foo()); // undefined

// 3.๋ฐ˜ํ™˜๋ฌธ์„ ์ƒ๋žตํ•  ์‹œ undefined๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค

function foo () {
  // ๋ฐ˜ํ™˜๋ฌธ์„ ์ƒ๋žตํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ undefined๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.
}

console.log(foo()); // undefined

๐Ÿ“Œ์ฐธ์ดˆ์— ์˜ํ•œ ์ „๋‹ฌ๊ณผ ์™ธ๋ถ€ ์ƒํƒœ ๋ณ€๊ฒฝ

์›์‹œ ๊ฐ’๊ณผ ๊ฐ์ฒด์˜ ๋น„๊ตโ€™์—์„œ ์‚ดํŽด ๋ดค๋“ฏ์ด ์›์‹œ๊ฐ’์€ ๊ฐ’์— ์˜ํ•œ ์ „๋‹ฌ, ๊ฐ์ฒด๋Š” ์ฐธ์กฐ์— ์˜ํ•œ ์ „๋‹ฌ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ๋™์ผํ•˜๋‹ค.

// ๋งค๊ฐœ๋ณ€์ˆ˜ primitive๋Š” ์›์‹œ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›๊ณ , ๋งค๊ฐœ๋ณ€์ˆ˜ obj๋Š” ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.
function changeVal(primitive, obj) {
  primitive += 100;
  obj.name = 'Kim';
}

// ์™ธ๋ถ€ ์ƒํƒœ
let num = 100;
let person = { name: 'Lee' };

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

// ์›์‹œ๊ฐ’์€ ๊ฐ’ ์ž์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜์–ด ์ „๋‹ฌ๋˜๊ณ  ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด ์ „๋‹ฌ๋œ๋‹ค.
changeVal(num, person);

// ์›์‹œ๊ฐ’์€ ์›๋ณธ์ด ํ›ผ์†๋˜์ง€ ์•Š๋Š”๋‹ค.
console.log(num); // 100

// ๊ฐ์ฒด๋Š” ์›๋ณธ์ด ํ›ผ์†๋œ๋‹ค.
console.log(person); // {name: "Kim"}

์œ„ ์˜ˆ์ œ์™€ ๊ฐ™์ด person๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ด๋ฅผ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ์›๋ณธ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š”๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์›์‹œ๊ฐ’์€ ๊ฐ’์„ ๋ณต์‚ฌํ•ด ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ํ–ฅ์ด ์—†๋‹ค


๐Ÿ“Œ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜ ํ˜•ํƒœ

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜

ํ•จ์ˆ˜์˜ ์ •์˜์™€ ๋™์‹œ์— ์ฆ‰์‹œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜(IIFE Immediately Invoked Function Expression)
๋‹จ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฉฐ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

// ์ต๋ช… ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜
(function () {
  let a = 3;
  let b = 5;
  return a * b;
}());

// ๊ธฐ๋ช… ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜
(function foo() {
  let a = 3;
  let b = 5;
  return a * b;
}());

foo(); // ReferenceError: foo is not defined

์ต๋ช…ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์ง€๋งŒ ๊ธฐ๋ช…ํ•จ์ˆ˜๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ฃน์—ฐ์‚ฐ์ž()๋‚ด์˜ ๊ธฐ๋ช…ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๋กœ ํ‰๊ฐ€๋˜๋ฉฐ ํ•จ์ˆ˜ ์ด๋ฆ„์€ ํ•จ์ˆ˜ ๋ชธ์ฒด์—์„œ๋งŒ ์ฐธ์กฐ๊ฐ€๋Šฅํ•˜์—ฌ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.
์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ๋ฃน ์—ฐ์‚ฐ์ž ()๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋„ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ธ์ˆ˜๋„ ์ „๋‹ฌ ํ•œ๋‹ค.

// ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋„ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
let res = (function () {
  let a = 3;
  let b = 5;
  return a * b;
}());

console.log(res); // 15

// ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์—๋„ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
res = (function (a, b) {
  return a * b;
}(3, 5));

console.log(res); // 15

์žฌ๊ท€ ํ•จ์ˆ˜

ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์žฌ๊ท€ ํ˜ธ์ถœ์ด๋ผ๊ณ  ํ•œ๋‹ค.

function countdown(n) {
  if (n < 0) return;
  console.log(n);
  countdown(n - 1); // ์žฌ๊ท€ ํ˜ธ์ถœ
}

countdown(10);

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹
let 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

ํ•จ์ˆ˜ ์‹๋ณ„์ž๋Š” factorial์ด์ง€๋งŒ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„foo๋ฅผ ์‚ฌ์šฉํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹น์—ฐํžˆ ํ•จ์ˆ˜ ์‹๋ณ„์žfactorial๋กœ๋„ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๋‹ค.


์ค‘์ฒฉ ํ•จ์ˆ˜

์ค‘์ฒฉ ํ•จ์ˆ˜(nested function)๋˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜(inner function)๋ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ค‘์ฒฉ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜(outer function)๋ผ ํ•œ๋‹ค.

function outer() {
  let x = 1;

  // ์ค‘์ฒฉ ํ•จ์ˆ˜
  function inner() {
    let y = 2;
    // ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    console.log(x + y); // 3
  }

  inner();
}

outer();

ES6๋ถ€ํ„ฐ๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์„ if๋ฌธ์ด๋‚˜ for๋ฌธ ๋“ฑ์˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‹จ ํ˜ธ์ด์ŠคํŒ…์œผ๋กœ ์ธํ•ด ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.
์ค‘์ฒฉ ํ•จ์ˆ˜๋Š” ํด๋กœ์ €์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค.


์ฝœ๋ฐฑ ํ•จ์ˆ˜

ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.
๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜์˜ ์™ธ๋ถ€์—์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ๊ณ ์ฐจ ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

// ์™ธ๋ถ€์—์„œ ์ „๋‹ฌ๋ฐ›์€ f๋ฅผ n๋งŒํผ ๋ฐ˜๋ณต ํ˜ธ์ถœํ•œ๋‹ค
function repeat(n, f) {
  for (let i = 0; i < n; i++) {
    f(i); // i๋ฅผ ์ „๋‹ฌํ•˜๋ฉด์„œ f๋ฅผ ํ˜ธ์ถœ
  }
}

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

// ๋ฐ˜๋ณต ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.
repeat(5, logAll); // 0 1 2 3 4

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

// ๋ฐ˜๋ณต ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.
repeat(5, logOdds); // 1 3

โ—๊ณ ์ฐจํ•จ์ˆ˜

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜.
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ž์‹ ์˜ ์ผ๋ถ€๋ถ„์œผ๋กœ ํ•ฉ์„ฑ
  • ์ „๋‹ฌ๋ฐ›์€ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์‹œ์ ์„ ๊ฒฐ์ •ํ•ด์„œ ํ˜ธ์ถœ
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌ ๊ฐ€๋Šฅ

์ต๋ช…ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ •์˜ํ•˜๋ฉด์„œ ๋ฐ”๋กœ ๊ณ ์ฐจ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š”๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค

// ์ต๋ช… ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ๊ณ ์ฐจ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•œ๋‹ค.
// ์ต๋ช… ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์€ repeat ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
repeat(5, function (i) {
  if (i % 2) console.log(i);
}); // 1 3

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ(์ด๋ฒคํŠธ, Ajaxํ†ต์‹ , ํƒ€์ด๋จธํ•จ์ˆ˜ ๋“ฑ)์— ํ™œ์šฉ๋˜๋Š” ์ค‘์š”ํ•œ ํŒจํ„ด์ด๋‹ค.

// ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
// myButton ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
document.getElementById('myButton').addEventListener('click', function () {
  console.log('button clicked!');
});

// ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
// 1์ดˆ ํ›„์— ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
setTimeout(function () {
  console.log('1์ดˆ ๊ฒฝ๊ณผ');
}, 1000);

๋ชจ๋“  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๊ณ ์ฐจ ํ•จ์ˆ˜์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. setTimeoutํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” setTimeoutํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ฐฐ์—ด ๊ณ ์ฐจ ํ•จ์ˆ˜ ์˜ˆ์ œ

// ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜ map
let res = [1, 2, 3].map(function (item) {
  return item * 2;
});

console.log(res); // [2, 4, 6]

// ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜ filter
res = [1, 2, 3].filter(function (item) {
  return item % 2;
});

console.log(res); // [1, 3]

// ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜ reduce
res = [1, 2, 3].reduce(function (acc, cur) {
  return acc + cur;
}, 0);

console.log(res); // 6

์ˆœ์ˆ˜ ํ•จ์ˆ˜์™€ ๋น„์ˆœ์ˆ˜ ํ•จ์ˆ˜์ˆœ์ˆ˜ํ•จ์ˆ˜์™€ ๋น„์ˆœ์ˆ˜ํ•จ์ˆ˜ ํ‘œ

์ˆœ์ˆ˜ ํ•จ์ˆ˜ ์˜ˆ์ œ

let count = 0; // ํ˜„์žฌ ์นด์šดํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ

// ์ˆœ์ˆ˜ ํ•จ์ˆ˜ increase๋Š” ๋™์ผํ•œ ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด ์–ธ์ œ๋‚˜ ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
function increase(n) {
  return ++n;
}

// ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ณ€์ˆ˜์— ์žฌํ• ๋‹นํ•ด์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ
count = increase(count);
console.log(count); // 1

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

์ˆœ์ˆ˜ํ•จ์ˆ˜์˜ ํŠน์ง•

  • ๋ถ€์ž‘์šฉ์ด ์—†๋‹ค
    -์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ์ข…์†๋˜์ง€ ์•Š์œผ๋ฉฐ, ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ๋ถ€์ž‘์šฉ์ด ์—†๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • ์ž…๋ ฅ๋งŒ์ด ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค
    -๋™์ผํ•œ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง€๋ฉด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.์ฆ‰, ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋Š” ์˜ค๋กœ์ง€ ์ž…๋ ฅ ๊ฐ’์— ์˜์กดํ•˜๋ฉฐ, ์™ธ๋ถ€ ์ƒํƒœ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

  • ๊ฐ€๋ณ€์„ฑ์ด ์—†๋‹ค
    -ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๊ฐ€๋ณ€์ ์ธ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ
    -์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์ด๋ž€ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์œ„์น˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š” ํŠน์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค.

๋น„์ˆœ์ˆ˜ ํ•จ์ˆ˜ ์˜ˆ์ œ

let count = 0; // ํ˜„์žฌ ์นด์šดํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ: increase ํ•จ์ˆ˜์— ์˜ํ•ด ๋ณ€ํ™”ํ•œ๋‹ค.

// ๋น„์ˆœ์ˆ˜ ํ•จ์ˆ˜
function increase() {
  return ++count; // ์™ธ๋ถ€ ์ƒํƒœ์— ์˜์กดํ•˜๋ฉฐ ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.
}

// ๋น„์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ์ƒํƒœ(count)๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.
increase();
console.log(count); // 1

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

๋น„์ˆœ์ˆ˜ ํ•จ์ˆ˜์˜ ํŠน์ง•

  • ๋ถ€์ž‘์šฉ์ด ์žˆ๋‹ค
    ๋น„์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ์˜์กดํ•˜๊ฑฐ๋‚˜, ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ž…๋ ฅ ์ด์™ธ์˜ ์š”์†Œ์— ์˜์กด
    ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋Š” ์ž…๋ ฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์™ธ๋ถ€ ์ƒํƒœ๋‚˜ ์‹œ๊ฐ„ ๋“ฑ ๋‹ค์–‘ํ•œ ์š”์†Œ์— ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฐ€๋ณ€์„ฑ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
    ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๊ฐ€๋ณ€์ ์ธ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์ „์—ญ ๋ณ€์ˆ˜์˜ ์ˆ˜์ • ๋˜๋Š” ์™ธ๋ถ€ ์ž์›์˜ ๋ณ€๊ฒฝ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์œผ๋ฉด ๋น„์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค.
์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ์ตœ์†Œํ™”ํ•ด์„œ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ–ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ตœ๋Œ€ํ•œ ์–ต์ œํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด๋Š” ๋…ธ๋ ฅ์˜ ์ผํ™˜์ด๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€