Front-end ๐Ÿ”ฅ๐Ÿ–ค/JavaScript

๐Ÿ“š ๋“œ๋ฆผ์ฝ”๋”ฉ by ์—˜๋ฆฌ JavaScript ์ •๋ฆฌ 4. ํ•จ์ˆ˜์˜ ์„ ์–ธ๊ณผ ํ‘œํ˜„

stable_sound 2022. 2. 4. 15:38

Function 

- ํ”„๋กœ๊ทธ๋žจ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ

- ์—ฌ๋Ÿฌ๋ฒˆ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ

- ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ฐ’์„ ๊ณ„์‚ฐ

 

ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ -> ์—ฐ์‚ฐ -> ์ถœ๋ ฅ ์˜ ๊ณผ์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

 

ํ”„๋กœ๊ทธ๋žจ์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ function๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๊ณ  function ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ sub program์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

 

1. ํ•จ์ˆ˜ ์„ ์–ธ

 

function ์ด๋ฆ„ (ํŒŒ๋ผ๋ฏธํ„ฐ) {
body... 
return;
}

 

ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ด๋ฆ„๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ๋™์‚ฌ ํ˜•ํƒœ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.

 

js์—์„œ ํ•จ์ˆ˜๋Š” object์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋˜์–ด ํ•จ์ˆ˜๋ฅผ return ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

2. ํŒŒ๋ผ๋ฏธํ„ฐ (๋งค๊ฐœ ๋ณ€์ˆ˜)

 

- ๊ฐ’์œผ๋กœ ์ „๋‹ฌ (primitive parameters)

 

function changeName(obj) {
  obj.name = "coder";
}

 

- ์ฐธ์กฐ๋กœ ์ „๋‹ฌ (object parameters)

 

const ellie = { name: "ellie" };
changeName(ellie);
console.log(ellie);

 

3. Default parameters

 

ES6์—์„œ ์ถ”๊ฐ€๋œ ๊ฒƒ์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ธฐ๋ณธ ๊ฐ’์„ ์ง€์ • ํ•ด์ค€๋‹ค.

function showMessage(msg, from = "unknown") {
  console.log(`${msg} by ${from}`);
}

showMessage("hi!");

 

๋งŒ์•ฝ์— ๊ธฐ๋ณธ ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด

 

function showMessage(msg, from) {
  console.log(`${msg} by ${from}`);
}

showMessage("hi!");

๊ฒฐ๊ณผ

undefined๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

4. rest parameters

 

๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋ฐ›์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

 

function printAll(...args) {
  for (let i = 0; i < args.length; i++) {
    console.log(args[i]);
  }
}

// ์ด๋Ÿฐ ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค!
// for (const arg of args) {
//     console.log(arg);
// }

// args.forEach((arg) => console.log(arg));

printAll("dream", "coding", "ellie"); // > dream coding ellie ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ

 

 

5. Local scope 

 

๋ฐ–์—์„œ๋Š” ์•ˆ์ด ๋ณด์ด์ง€ ์•Š๊ณ  ์•ˆ์—์„œ๋งŒ ๋ฐ–์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค..!!!

 

let globalMessage = "global"; // global ๋ณ€์ˆ˜
function printMessage() {
  let message = "hello"; // local ๋ณ€์ˆ˜
  console.log(message);
  console.log(globalMessage);
  function printAnother() {
    console.log(message); // ์ž์‹ํ•จ์ˆ˜๊ฐ€ ๋ถ€๋ชจํ•จ์ˆ˜์— ์ •์˜๋œ message ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฒƒ -> ํด๋กœ์ €
    let childMessage = "hello";
  }
}

printMessage();

 

6. return a value

 

function sum(a, b) {
  return a + b;
}
const result = sum(1, 2);
console.log(result);

// ๊ทผ๋ฐ ๋งŒ์•ฝ function ์— return์ด ์—†๋‹ค๋ฉด ์•Œ์•„์„œ return undefined๊ฐ€ ๋œ๋‹ค.

// ์ถ”๊ฐ€) early return , early exit (์กฐ๊ธฐ ๋ฆฌํ„ด, ์กฐ๊ธฐ ์ข…๋ฃŒ)
// function ์•ˆ์—์„œ ๊ฐ€๋…์„ฑ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์กฐ๊ฑด์— ์•ˆ๋งž์„ ๋•Œ ๋ฐ”๋กœ๋ฐ”๋กœ return ๋˜๋„๋ก ํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค.

//bad
function upgradeUser(user) {
  if (user.point > 10) {
    // ...
  } else {
    return;
  }
}

//good
function upgradeUser(user) {
  if (user.point <= 10) {
    return;
  } else {
    // ...
  }
}

 

 

First-class function

 

1. function expression

// print(); > ์„ ์–ธ ์ „ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋ฐœ์ƒ.
const print = function () {
  // ๋ณ€์ˆ˜์— ํ•จ์ˆ˜ ํ• ๋‹น
  console.log("print!");
};
print(); // > print!

const print2 = print;
print2(); // > print!

function sum(a, b) {
  return a + b;
}
const sum2 = sum; //์ด๋ฏธ ์„ ์–ธํ•œ ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ๋‹ค์‹œ ํ• ๋‹น ๊ฐ€๋Šฅ
console.log(sum2(1, 2)); // > 3

 

2. ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ callback ํ•จ์ˆ˜

function randomQuiz(answer, printYes, printNo) {
  if (answer === "love you") {
    printYes();
  } else {
    printNo();
  }
}

// ์ต๋ช…ํ•จ์ˆ˜
const printYes = function () {
  console.log("yes!!");
};

// named function
const printNo = function print() {
  console.log("no~~");
};

randomQuiz("wrong", printYes, printNo); // ํ•„์š”ํ•  ๋•Œ ๋•Œ์— ๋งž์ถฐ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•ด๋ผ..!! ๋ญ ๊ทธ๋Ÿฐ!
randomQuiz("love you", printYes, printNo);

 

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

- ํ•ญ์ƒ ์ต๋ช…ํ•จ์ˆ˜์ด๋‹ค

- ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

- ๋ฐฐ์—ด/๋ฆฌ์ŠคํŠธ์— ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.

 

const simplePrint = () => console.log("simple~");

const add = (a, b) => a + b;

const simpleMultiply = (a, b) => {
  return a * b;
};