1. 함수 표현식

 

let sayHi = function() {
  alert( "Hello" );
};

 

  자바스크립트에선 다음과 같이 변수에 함수를 할당할 수 있다. 이와같이 변수에 함수가 할당된 것을 함수 표현식이라고 한다.

  그렇다면 왜 자바스크립트에선 다른 언어와 달리 함수 표현식으로 나타내는 것이 가능할까?

  그것은 바로 자바스크립트가 함수를 값으로 취급하기 때문이다.

 

  즉, 함수를 다른 변수와 동일하게 다룰 수 있다는 의미이다. 이와 같은 언어를 일급 함수를 가졌다고 표현한다.

  일급 함수를 가진 언어에서는 함수를 다른 함수에 매개변수로 제공하거나, 함수가 함수를 반환할 수 있으며, 변수에도 할당할 수 있다.

 

 

 

2. 콜백 함수

 

  앞서 자바스크립트에서는 다른 함수의 매개 변수로 함수를 제공할 수 있다고 했다.

  아래 예시를 살펴보자.

function ask(question, yes, no) {
  if (confirm(question)) yes()
  else no();
}

function showOk() {
  alert( "동의하셨습니다." );
}

function showCancel() {
  alert( "취소 버튼을 누르셨습니다." );
}

// 사용법: 함수 showOk와 showCancel가 ask 함수의 인수로 전달됨
ask("동의하십니까?", showOk, showCancel);

  

  ask함수의 인수로 showOk, showCancel 이라는 함수가 전달됐고 confirm(question)의 결과에 따라 해당 함수를 실행함을 알 수 있다.

  이처럼 어떤 함수가 다른 함수의 인수로 전달되어 특정 동작후에 나중에 호출되는 함수를 콜백 함수라 한다.

  너가 특정 동작을 한 후에 나를 호출해줘라는 의미에서 call back이라 부르는 것이다.

 

 

 

3. 함수 표현식 vs 함수 선언문

 

  첫 번째 차이는 기본적인 문법의 차이이다.

 

function sum(a, b) {
  return a + b;
} //함수 선언문

let sum = function(a, b) {
  return a + b;
}; //함수 표현식

 

  두 번째 차이는 자바스크립트 엔진이 언제 함수를 생성하는지에 있다.

  함수 표현식은 실제 실행 흐름이 해당 함수에 도달했을 때 함수를 생성한다.

  따라서 실행 흐름이 함수에 도달했을 때부터 해당 함수를 사용할 수 있다.

 

  하지만 함수 선언문은 조금 다르다.

  함수 선언문은 함수 선언문이 정의되기 전에도 호출할 수 있다.

  이것이 가능한 이유는 자바스크립트 엔진이 변수 선언, 함수 선언문을 스크립트의 젤 위로 먼저 위치시키기 때문이다.

  이것을 Hoisting이라고 한다.

  따라서 스크립트는 함수 선언문을 먼저 처리한 이후에서야 나머지 코드를 실행한다.

  따라서 스크립트 어디서든 함수 선언문으로 선언한 함수에 접근할 수 있는 것이다.

 

 

 

4. Arrow function(화살표 함수)

 

  화살표 함수는 문법의 생김새에 따라 이름이 지어졌다.

  굳이 구분할 것도 없지만 처음에 나도 화살표 함수를 접할 때 굉장히 익숙하지 않아서 적응하는데 애를 먹었다.

  화살표 함수는 크게 세 가지 형태만 기억하면 된다.

 

  4 - 1) 인수가 하나밖에 없다면 인수를 감싸는 괄호를 생략할 수 있다. 괄호를 생략하면 코드 길이를 더 줄일 수 있다.

 

let double = n => n * 2;
// let double = function(n) { return n * 2 }과 동일하다.

alert( double(3) ); // 6

 

  4 - 2) 인수가 하나도 없을 땐 괄호를 비워놓으면 된다. 다만, 이 때 괄호는 생략할 수 없다.

 

let sayHi = () => alert("안녕하세요!");

sayHi();

 

  4 - 3) 평가해야 할 표현식이나 구문이 여러 개인 함수가 있을 수도 있다.

 

    이때는 중괄호 안에 평가해야 할 코드를 넣어주어야 한다.

    그리고 return 지시자를 사용해 명시적으로 결괏값을 반환해 주어야 한다.

let sum = (a, b) => {  // 중괄호는 본문 여러 줄로 구성되어 있음을 알려줍니다.
  let result = a + b;
  return result; // 중괄호를 사용했다면, return 지시자로 결괏값을 반환해주어야 합니다.
};

alert( sum(1, 2) ); // 3

 

 

 

*출처 : ko.javascript.info/function-expressionsko.javascript.info/arrow-functions-basics, developer.mozilla.org/ko/docs/Glossary/First-class_Function

'Programming Language > Javascript' 카테고리의 다른 글

ES11 - null 병합 연산자 '??'  (0) 2021.01.09
ES6 - Promise & Async/Await  (0) 2021.01.04
ES6 - 구조 분해 할당  (0) 2020.12.31
ES6 - Class(1)  (0) 2020.12.29
Rest Parameter & Spread Syntax  (0) 2020.11.06

+ Recent posts