5. Arrow function

  1. sub-program

๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์ด ์žˆ๋Š”๊ฑด ๋ชจ๋‘ ๋‹ค๋ฅธ function์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ.
ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ ์ž‘์€ ๊ธฐ๋Šฅ๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด function์ด๋‹ค

Input์œผ๋กœ parameter๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ ,
Output์œผ๋กœ return์„ ํ•˜๋Š” ๊ฒƒ์ด function

๊ทธ๋ž˜์„œ, ์–ธ์–ด ์ž์ฒด์— ์กด์žฌํ•˜๋Š” function์„ ์“ฐ๊ฑฐ๋‚˜
API(application programming Interface)๋ฅผ ์“ธ ๋•Œ, function์˜ ์ด๋ฆ„์„ ๋ณด๊ณ  ๊ทธ ๊ธฐ๋Šฅ์„ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์Œ
์ „๋‹ฌํ•ด์•ผํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด ๋ญ”์ง€, ์–ด๋–ค ๊ฐ’์ด return๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ด๋Ÿฐ Interface๋ฅผ ๋ณด๋ฉด์„œ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค

๊ทธ๋ž˜์„œ Input๊ณผ output์ด ์ค‘์š”ํ•˜๊ณ , function์˜ ์ด๋ฆ„์ด ์ค‘์š”ํ•œ ๊ฒƒ!

function

ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋นŒ๋”ฉ๋ธ”๋Ÿญ
sub program์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, ์—ฌ๋Ÿฌ๋ฒˆ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
ํ•œ๊ฐ€์ง€์˜ task๋‚˜, ์–ด๋–ค ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ์—ฌ์ง

## 1. function declaration ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•!


function name (param1,param2) { body... return; }

function ํ‚ค์›Œ๋“œ ์ž…๋ ฅ
name ์ด๋ฆ„ ์ง€์ •
parameters ๋‚˜์—ด
body ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ์  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ž‘์„ฑ
return


  • ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋Š” ํ•œ๊ฐ€์ง€์˜ ์ผ๋งŒ.
  • ๋ณ€์ˆ˜ ๋„ค์ด๋ฐ์ด ๋ช…์‚ฌ์ด๋“ฏ์ด ํ•จ์ˆ˜ ๋„ค์ด๋ฐ์€ doSomethingํ˜•ํƒœ, command ํ˜•ํƒœ, verb ํ˜•ํƒœ๋กœ
  • ๋งŒ์•ฝ ์ด๋ฆ„์ง“๋Š”๊ฒŒ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค๋ฉด? ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•˜๊ณ ์žˆ์ง€๋Š” ์•Š๋Š”์ง€ ์ƒ๊ฐ! * e.g. createCardAndPoint -> createCard, createPoint๋กœ ์„ธ๋ถ„ํ™”

  • function์€ JS์—์„œ object๋กœ ๊ฐ„์ฃผ๋œ๋‹ค ๊ทธ๋ž˜์„œ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ , parameter๋กœ ์ „๋‹ฌ์ด ๋˜๊ณ , ํ•จ์ˆ˜๋ฅผ returnํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.

Type Script )

function log(message:string) { console.log(message); }

TS์—์„œ๋Š” parameter๋‚˜, return์˜ ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค.

  • parameter์˜ ํƒ€์ž…์€ (message:string) ์ด๋ ‡๊ฒŒ -return์˜ ํƒ€์ž…์€ (message:string):number์ด๋ ‡๊ฒŒ

ํƒ€์ž…์„ ๋ช…์‹œํ•ด์ค˜์•ผํ•จ

  • ์ด TS๋Š”,

  • ๊ทœ๋ชจ์žˆ๋Š” ํ”„๋กœ์ ํŠธ
  • ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž์™€ ํ˜‘์—…์„ ํ•  ๋•Œ
  • ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒƒ์„ APIํ˜•ํƒœ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ œ๊ณตํ•ด์•ผํ•  ๋•Œ
์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๊ฐœ๋ฐœ์„ ์›ํ™œํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค!

ํ•จ์ˆ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋ด๋„, ์ด ํ•จ์ˆ˜๊ฐ€ ๋ญ˜ ํ•˜๋Š” ํ•จ์ˆ˜์ด๊ณ  ์–ด๋–ค ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•˜๊ณ  ์–ด๋–ค ๋ฐ์ดํ„ฐ ํƒ€์ž…์ธ์ง€, ์–ด๋–ค ๊ฐ’์ด ๋ฆฌํ„ด๋˜๋Š”์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—.

## 2. Parameters

function์— ์ „๋‹ฌ๋˜๋Š” ์ด parameters๋Š”

  • Premitive parameters: passed by value
    ๋ฉ”๋ชจ๋ฆฌ์— ๊ทธ๋Œ€๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์—, value๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค
  • object parameters: passed by reference
    reference๊ฐ€ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— reference๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค

 function changeName(obj) {
   obj.name = 'coder';
 }
 //์ „๋‹ฌ๋œ ๊ฐ์ฒด ์•ˆ์˜ name์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜
 const ellie = { name: 'ellie'};
 changeName(ellie);
 console.log(ellie); //ellie

object๋Š” reference๋กœ ์ €์žฅ๋จ. ์•„๋ž˜๋Š” ์˜ˆ์‹œ

object๋Š” reference๋กœ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—,
ํ•จ์ˆ˜ ์•ˆ์—์„œ ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์ด ๊ทธ๋Œ€๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์šฉ๋œ๋‹ค

3. Default parameters (added in ES6)

default ๊ฐ’์„ ๋ฏธ๋ฆฌ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” default parameters

  • ๊ธฐ์กด์˜ ๋ฐฉ์‹
function showMessage(message, from) {
  if(from == undefined) {
    from = 'unknown';
  }
  console.log(`${message} by ${from}`);
}
showMessage('Hi!');

๊ธฐ์กด์—๋Š” ์ด๋ ‡๊ฒŒ, undefined์ผ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด์„œ ์กฐ๊ฑด๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผํ–ˆ์ง€๋งŒ

  • ES6์˜ ๋ฐฉ์‹
function showMessage(message, from = 'unknown') {
  console.log(`${message} by ${from}`);
}
showMessage('Hi!');

์‚ฌ์šฉ์ž๊ฐ€ parameter๊ฐ’์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์„๋•Œ, ๊ฐ’์ด ์ด๋ ‡๊ฒŒ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋˜์–ด์„œ ์‚ฌ์šฉ๋œ๋‹ค

  1. Rest parameters (added in ES6)
function printAll(...args) {
  for(let i = 0; i < args.length; i++) {
    console.log(arg[i]);
  }
}
printAll('dream','coding','ellie'); //์ธ์ž๋กœ ์„ธ๊ฐœ์˜ ๊ฐ’์„ ์ „๋‹ฌ

โ€ฆ ์ด๋ ‡๊ฒŒ ์ „๋‹ฌํ•˜๋ฉด ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ „๋‹ฌ์ด ๋œ๋‹ค!
โ€˜dreamโ€™,โ€™codingโ€™,โ€™ellieโ€™ ์ด๋ ‡๊ฒŒ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์€ ์„ธ๊ฐœ์˜ ๊ฐ’์ด ๋‹ด๊ธด ๋ฐฐ์—ด์ด ๋œ๋‹ค

function printAll(...args) {
    for(const arg of args) {
    console.log(arg);
  }
}
printAll('dream','coding','ellie'); //์ธ์ž๋กœ ์„ธ๊ฐœ์˜ ๊ฐ’์„ ์ „๋‹ฌ

for๋ฌธ๋ณด๋‹ค ๊ฐ„๋‹จํ•œ for of๋ฌธ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Œ
arg์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ’๋“ค์ด, ์ฐจ๋ก€๋Œ€๋กœ ํ•˜๋‚˜์”ฉ arg๋กœ ์ง€์ •์ด ๋˜๋ฉด์„œ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค

function printAll(...args) {
    args.forEach((arg) => console.log(arg));
  }
}
printAll('dream','coding','ellie'); //์ธ์ž๋กœ ์„ธ๊ฐœ์˜ ๊ฐ’์„ ์ „๋‹ฌ

5. Local scope

์ฐธ์กฐ) closer, LexicalEnvironment

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

์ด๊ฒƒ์ด scope์˜ ๊ฐœ๋…

let globalMessage = 'global'; // global variable ์ „์—ญ๋ณ€์ˆ˜
function printMessage() {
  let message = 'hello';
  console.log(message); // lacal variable ์ง€์—ญ๋ณ€์ˆ˜
  console.log(globalMessage);

  function printAnother() {
    let childMessage = 'hello';
  }
  // console.log(childMessage) //error
}
printMessage();

์ž์‹์€ ๋ถ€๋ชจ์—๊ฒŒ์„œ ์ •์˜๋œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค์ง€๋งŒ
์ž์‹ ์•ˆ์— ์ •์˜๋œ childMessage๋ฅผ ๋ถ€๋ชจ์—์„œ ๋ณผ ์ˆ˜ ์—†์Œ

  • ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜์—์„œ ์ž์‹์˜ ํ•จ์ˆ˜๊ฐ€, ๋ถ€๋ชจ ํ•จ์ˆ˜์— ์ •์˜๋œ ๋ณ€์ˆ˜์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋“ค์ด ๋ฐ”๋กœ closer.

6. Return a value

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

parameters๋กœ ๊ฐ’์„ ์ „๋‹ฌ ๋ฐ›์•„์„œ, ๊ณ„์‚ฐ๋œ ๊ฐ’์„ returnํ•  ์ˆ˜ ์žˆ๋‹ค

let globalMessage = 'global';
function printMessage() {
  let message = 'hello';
  console.log(message);
  console.log(globalMessage);

  function printAnother() {
    let childMessage = 'hello';
  }
   return undefined;
}
printMessage();

์•„๊นŒ ๋ดค๋˜, ์ด๋ ‡๊ฒŒ return์ด ์—†๋Š” ํ•จ์ˆ˜๋“ค์€ return undefined๊ฐ€ ๋œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค
๋ชจ๋“  ํ•จ์ˆ˜๋Š” return undefined์ด๊ฑฐ๋‚˜, ๊ฐ’์„ Returnํ•  ์ˆ˜ ์žˆ๋‹ค

7. Early return, early exit

  • ๋‚˜์œ ์˜ˆ!
Function upgraderUser(user) {
  if(user.point > 10) {
    //long upgrade logic
  }
}

ํ•ด๋‹น ์กฐ๊ฑด์ผ ๋•Œ์—๋งŒ ๋ฌด์–ธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋กœ์ง์ด ์žˆ๋‹ค. block์•ˆ์—์„œ ๋กœ์ง์„ ๋งŽ์ด ์ž‘์„ฑํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

  • ์ข‹์€ ์˜ˆ!
Function upgraderUser(user) {
  if(user.point <= 10) {
    return;
  }
    //long upgrade logic
}

if else๋ฅผ ๋ฒˆ๊ฐˆ์•„์„œ ์“ฐ๋Š” ๊ตฌ์กฐ๋ณด๋‹ค๋Š”, ์กฐ๊ฑด์ด ๋งž์ง€ ์•Š์„ ๋•Œ ์ด๋ ‡๊ฒŒ ๋นจ๋ฆฌ return ์‹œ์ผœ๋ฒ„๋ฆฌ๊ณ !
์กฐ๊ฑด์ด ๋งž์„ ๋•Œ๋งŒ ๊ทธ ๋‹ค์Œ์œผ๋กœ ์™€์„œ ํ•„์š”ํ•œ ๋กœ์ง๋“ค์„ ์ญ‰ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์ข‹๋‹ค.

  • ์กฐ๊ฑด์ด ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  • ๊ฐ’์ด undefined์ธ ๊ฒฝ์šฐ
  • ๊ฐ’์ด -1์ธ ๊ฒฝ์šฐ