-
[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()과 똑같다고 보면 된다.
'node.js(노드)' 카테고리의 다른 글
[Node.js] 이벤트처리 'EventEmitter' 사용방법 (0) 2020.08.11 [node.js] 프로토 타입(prototype) (1) 2020.08.11 [node.js] 동기와 비동기(2) Callback과 async의Waterfall (0) 2020.08.10 [node.js] 동기와 비동기 (1) 기본 이해 (0) 2020.08.07 [node.js] 콜백(callback)함수(2) (0) 2020.08.01