ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [node.js] 콜백(callback)함수(1)
    node.js(노드) 2020. 7. 31. 23:57

    처음 callback함수를 공부하지도 않고 접했을 때는 이게 뭔 기능인지 이해할 수 없었다.

    C, 자바만 해오던 나에게 변수 안에 함수를 넣는다는 개념은 존재하지 않았으니...

     

    기존에 개발하던 사람의 코드를 볼 때 나는 callback이라는 기능이 라이브러리처럼 기능인줄 알았으나 자바스크립트의 기초를 활용한 기술?이라고 표현하는 게 옳다고 생각한다.

     

     

    일단 위에 적은데로 자바스크립트에서 가장 놀랐던 점은 함수를 변수처럼 넣을 수 있다는 것이다.

     

     

    예를 들면

    function call() {
        console.log("call 함수 실행");
    }
    var v1 = call;
    var v2 = v1;
    call();
    v1();
    v2();

    var라는 변수에 함수를 넣고 해당 선언한 거를 실행시키면 함수가 실행된다.

     

    이게 자바스크립트의 특징 중 하나다.

     

    그러면 매개변수에 함수를 넣으면 어떻게 될까?

     

    function call(callback) {
        console.log("call 함수 실행");
        callback();
    }
    
    function call2() {
        console.log("call2 함수 실행");
    }
    call(call2);

    이렇게 되면 매개변수 안에 함수가 되어있으니 callback=call2가 되고 call함수 안에 call2가 실행된다.

     

     

    자 여기서 "call2 함수 실행" 로그가 나오게 하려면 어떻게 해야 할까?

    function call1 () {
        function call2() {
            console.log("call2 함수 실행");
        }
        return call2;
    }
    call1();

    나 같은 초보자는 call1();을 실행하면 "call2 함수 실행"이라는 로그가 발생할 거라 생각한다

     

    하지만 아무 일도 일어나지 않는다

     

    이해가 안 간다면 이 글 맨 첫 번째 함수를 보고 와라

    함수가 실행될 때는 어떻게 실행되는가?

     

    아무리 변수가 v1으로 선언했어도 함수 실행은 v1();으로 실행한다.

     

    그렇기 때문에 여기서 call1();을 실행할 때 반환되는 값은 call2이다

    즉 call1()은 call2라는 것이다

    그럼 call2를 실행하려면 call2(); 로 실행해야 한다

    그렇기 때문에

    function call1 () {
        function call2() {
            console.log("call2 함수 실행");
        }
        return call2;
    }
    call1()();

    이렇게 실행해야 해당 로그가 발생한다. 이해가 안 간다면 다른 문서를 참고해도 좋다.

     

     

    마지막으로 return문 안에 function을 넣으면 어떻게 될까?

     

    function call () {
        return function () {
            console.log("리턴된 함수 실행");
        };
    }
    call()();
    
    var v1 = call();
    v1();

    위에꺼를 이해했으면 알아듣기 쉬울 것이라 생각한다.

    call() 함수의 리턴 상황은 변수 v1과 똑같다(v1() 아님)

    var v1을 실행할 때는 v1()로 실행하는 것을 기억하는가?

    그렇기 때문에 실행시키려면 call()();으로 ()를 2번 넣어야 한다.

    call()()=v1()과 똑같다고 보면 된다.

     

     

     

    참조 https://deftkang.tistory.com/20

    댓글

Designed by Tistory.