JavaScript

Function, Arrow Function

김꼬알 2023. 6. 7. 18:41

Function

  • fundamental building block in the program
  • subprogram can be used multiple times
  • performs a task or calculates a value

 

1. Function declaration

  • 함수의 기본 형태: function name(param1, param2) {body ... return;}
  • 특징
  • one function === one thing    // 하나의 함수에서는 하나의 기능만 수행하는 것이 좋음
  • naming: doSomething, command, verb    // 함수 이름은 어떤 기능을 하는지 보기 쉽게 작성하는 것이 좋음
  • e.g. createCardAndPoint -> createCard, createPoint
  • function is object in JS    // 함수는 자바스크립트에서 오브젝트의 일종
// Hello를 출력하는 함수
function printHello() {
  console.log('Hello');
}
printHello();    // Hello


// 메시지를 출력하는 함수
function log(message) {
  console.log(message);
}
log('Hello@');    // Hello@
log(1234);    // 1234

 

2. Parameters

  • premitive parameters: passed by value
  • object parameters: passed by reference
function changeName(obj) {
  obj.name = 'coder';
}
const ellie = {name: 'ellie'};
changeName(ellie);    // ellie가 참조하는 레퍼런스를 coder로 변경
console.log(ellie);    // {name: 'coder'}

 

3. Default parameters (added in ES6)

function showMessage(message, from = 'unknown') {    // 입력되지 않은 값에 기본으로 unknown 출력되도록 함
  console.log(`${message} by ${from}`);
}
showMessage('Hi~');  // Hi~ by unknown

 

4. Rest parameters (added in ES6)

function printAll(...args) {    // 배열을 풀어서 출력할 때
  for(let i = 0; i < args.length; i++) {
    console.log(args[i]);
  }
printAll('dream'. 'coding', 'ellie');

// 배열에 있는 값을 출력하는 방법 2
function printAll(...args) {
  for(const arg of args) {
    console.log(arg);
  }
}

// 배열에 있는 값을 출력하는 방법 2
function printAll(...args) {
  args.forEach((arg) => console.log(arg));
}

 

5. Local Scope

  • 밖에서는 안이 보이지 않고 안에서만 밖을 볼 수 있음
  • 스코프 안에서 스코프 밖의 변수를 참조할 수 있지만, 스코프 밖에서 스코프 안의 변수는 참조할 수 없음
let globalMessage = 'global';    // global variable
function printMessage() {
  let message = 'hello';
  console.log(message);    // local variable
  console.log(globalMessage);
  
  function printAnother() {
    console.log(message);
    let childMessage = 'hello';
  }
  console.log(childMessage);    // error 발생! 스코프 안의 변수는 참조할 수 없음
}
printMessage();    // hello global

 

6. Return a value

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

 

7. Early return, early exit

// bad
function upgradeUser(user) {
  if(user.point > 10) {
    // long upgrade logic ...    // 블럭 안에 로직을 많이 작성하면 가독성이 떨어짐
  }
}


// good
function upgradeUser(user) {
  if(user.point <= 10) {
    return;    // 조건이 맞지 않을 때는 빨리 리턴해서 종료시키는 것이 좋음
  }
  // long upgrade logic ...
}

 

 

First-class function

  • functions are treated like any other variable
  • can be assigned as a value to variable
  • can be passed as an argument to other functions
  • can be returned by another function

 

1. Function expression

  • a function declaration can be called earlier than it tis defined (hoisted)
  • a function expression is created when the execution reaches it
const print = function () {    // anonymous function 이름없는 함수
  console.log('print');
};
print();    // print
const printAgain = print;
printAgain ();    // print
const sumAgain = sum;
console.log(printAgain(1, 3));    // 4

 

2. Callback funcrion using function expression

function randomQuiz(answer, printYes, printNo) {    // answer가 맞으면 printYes, 아니면 printNo 함수를 호출
  if(answer === 'love you') {
    printYes();
  } else {
    printNo();
  }
}
const printYes = function() {    // anonymous function
  console.log('yes!');
};

const printNo = function print() {    // named function: 디버깅할 때 어떤 함수에서 오류가 났는지 찾기 쉬움
  console.log('no!');
};

randomQuiz('wrong', printYes, printNo);    // no!
randomQuiz('love you', printYes, printNo);    // yes!

 

 

Arrow function

  • 항상 이름 없는 함수로 사용함(always anonymous)
const simplePrint = () => console.log('simplePrint!');
const add = (a, b) => a + b;
const simpleMultiply = (a, b) => {
  // do something more
  return a * b;
};

 

 

IIFE: Immediately Invoked Function Expression

  • 요즘에는 잘 사용하지 않지만 자바스크립트에서 바로 함수를 실행하고 싶을 때 사용할 수 있음
(function hello() {
  console.log('IIFE');
})();    // IIFE

 

'JavaScript' 카테고리의 다른 글

Object  (1) 2023.06.09
class vs object  (0) 2023.06.08
operator, if, for loop  (0) 2023.06.05
variable, let vs var, hoisting, data types  (0) 2023.06.02
JavaScript 기초, async 와 defer의 차이점  (0) 2023.06.02