스크립트를 작성하다 보면 사용자가 로그인이나 로그아웃을 했을 때 안내 메시지를 보여주는 동작 같은 경우 등 유사한 동작을 하는 코드가 여러 곳에서 필요할 때가 있다. 함수를 이용하면 중복 없이 유사한 동작을 하는 코드를 여러 번 호출할 수 있다.

함수 정의

  1. 주요 코드 흐름을 차지하는 방식 - 함수 선언문

    function add(x, y){
    return x + y; }
    
    console.log(add(2,7));
    
  2. 표현식 형태로 선언된 함수 - 함수 표현식

    함수를 호출했을 때 함수를 호출한 그곳에 특정 값을 반환하게 할 수 있다. 이때 이 특정 값을 반환 값이라고 부른다.

    지시자 return은 함수 내 어디서든 사용할 수 있다. 실행 흐름이 return을 만나면 함수 실행은 즉시 중단되고 함수를 호출한 곳에 값을 반환한다.

    함수도 값으로 인식한다.

    let sayHi = function() {
    alert("hello");
    }; // 함수 표현식
    
    function sayHi2() {
    	alert( "Hello" );
    }
     
    let func = sayHi2; // 함수 복사
    func(); // 복사한 함수 실행 (정상 실행됨)
    sayHi2();
    sayHi(); 
    
    // 모두 같음.
    
    
  3. 화살표 함수

    함수 표현식보다 단순하고 간결한 문법으로 함수를 만들 수 있다.

    let func = (arg1, arg2 …argN) ⇒ expression

    함수 func은 화살표 우측의 표현식을 평가하고 평가 결과를 반환한다.

    아래 함수 표현식의 축약 버전이라고 볼 수 있다.

    let func = function(arg1, arg2, ...argN){
    	return expression;
    };
    
  4. 호이스팅

    → 상수나 변수에 함수를 대입했을 경우와 화살표 함수를 이용하여 함수를 선언했을 때에는 호이스팅되지 않는다. 함수 생성 시점이 다름!

함수는 일급 객체

<aside> 💡

함수는 값이다. 따라서 함수도 값처럼 할당, 복사, 선언할 수 있다.

</aside>

  1. 일급 객체의 특성

    → 함수를 데이터(string, number, boolean, array, object) 다루듯이 다룰 수 있다.

    여기서 데이터를 다룬다는 의미는 변수에 값을 할당할 수 있다는 의미와 상통하므로, 함수 역시 할당이 가능하다고 해석될 수 있다.

  2. 할당

    function isOddNum (number) {
      console.log(
        (number % 2 ? '홀' : '짝')
        + '수입니다.'
      );
      return number % 2 ? true : false;
    };
    
    const checkIfOdd = isOddNum; // 뒤에 괄호 없음 유의
    
    console.log(checkIfOdd(23));
    
    --------------------------
    
    let x = 7, y = 3;
    
    let func1 = (a, b) => a + b;
    let func2 = (a, b) => a - b;
    console.log(func1(x, y), func2(x, y));
    
    func1 = func2
    console.log(func1(x, y), func2(x, y));
    
  3. 함수를 다른 함수의 인자로 전달하기

    let list = [1, 2, 3, 4, 5];
    
    function doInArray (array, func) {
      for (item of array) {
        func(item);
      }
    }
    
    // console.log - console이란 객체에서 log란 키에 할당된 함수
    doInArray(list, console.log);
    

    → doInArray : 고차함수

    function doNTimes (func, repeat, x, y) {
      let result = x;
      for (i = 0; i < repeat; i++) {
        result = func(result, y);
      }
      return result;
    }
    
    console.log(
      doNTimes((x, y) => x * y, 3, 5, 2),
      doNTimes((x, y) => x / y, 3, 5, 2),
    );
    

    인자로 전달된 함수들: 변수나 상수에 할당되지 않아 이름이 없음 - 익명 함수

  4. 함수를 결과값으로 반환하기

const add = (a, b) => a + b;
const sub = (a, b) => a - b;
const mul = (a, b) => a * b;
const div = (a, b) => a / b;

function comb3ArmFuncs(armFunc1, armFunc2, armFunc3) {
  return (x, y) => armFunc3(armFunc2(armFunc1(x, y), y), y);
}

const add_mul_sub = comb3ArmFuncs(add, mul, sub);
const mul_add_div = comb3ArmFuncs(mul, add, div);
const div_add_mul = comb3ArmFuncs(div, add, mul);

console.log(
  add_mul_sub(10, 4),
  mul_add_div(10, 4),
  div_add_mul(10, 4)
);
  1. 커링 (currying)

함수의 매개변수