함수를 리턴하는 함수

 

자바스크립트 코딩하면서 함수자체를 리턴하는 함수를 보았을 것이다.

 

 

1. 하나의 함수를 만들고 값을 리턴한다

function hello() {
  return "hello world";
}

hello();

 

2. 하나의 함수를 만들고 익명함수를 리턴한다

function hello() {
  return function world() {
    return "hello world";
  };
}

hello();

 

어떨때 함수를 리턴하는것을 사용할까?

예시를 들어보자

 

 

1. 3개의 버튼 마다 1의 로그가찍히는 이벤트 리스너등록

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button id="c1">C1</button>
    <button id="c2">C2</button>
    <button id="c3">C3</button>
    <script>
      function c() {
        console.log(1);
      }

      document.getElementById("c1").addEventListener("click", c);
      document.getElementById("c2").addEventListener("click", c);
      document.getElementById("c3").addEventListener("click", c);
    </script>
  </body>
</html>

addEventListener 의 두번째 인자는 함수를 처리해야한다.

만약 c1버튼을 누르면 1, c2버튼을 누르면 2를 호출하고싶다면

 

 

2. 3개의 버튼클릭시 c(n) 호출

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button id="c1">C1</button>
    <button id="c2">C2</button>
    <button id="c3">C3</button>
    <script>
      function c(n) {
        console.log(n);
      }

      document.getElementById("c1").addEventListener("click", c(1));
      document.getElementById("c2").addEventListener("click", c(2));
      document.getElementById("c3").addEventListener("click", c(3));
    </script>
  </body>
</html>

보기엔 잘동작할거같지만 함수 실행이안된다.

c() 로 하는순간 이벤트 리스너에게는 함수가 등록되는것이아닌 리턴값이 넣어지게된다.

그렇다면 이럴때 익명함수 리턴을 사용한다

 

 

2. 3개의 버튼클릭시 c(n) 호출 (리턴함수 사용)

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button id="c1">C1</button>
    <button id="c2">C2</button>
    <button id="c3">C3</button>
    <script>
      function c(n) {
        return function () {
          console.log(n);
        };
      }

      document.getElementById("c1").addEventListener("click", c(1));
      document.getElementById("c2").addEventListener("click", c(2));
      document.getElementById("c3").addEventListener("click", c(3));
    </script>
  </body>
</html>

이렇게한다면 c1 버튼 1 리턴, c2버튼 2리턴, c3버튼 3리턴이된다.

c() 로하는순간 이벤트 리스너에게는 리턴값이 넣어지므로

함수를 리턴시키면 -> 리턴값이함수이고 -> 함수등록이기때문에  

동작이가능하게된것이다.

 

이러한 기법으로 함수를 리턴하는 함수를 이용할수있다.

+ Recent posts