[node.js] Callback / Closure

1. Callback

함수에 전달되는 인자를 통해 또다른 함수를 호출하는 구조

  • 비동기처리 관점에서

기존 return을 통해 구현하기 힘들었던 비동기처리 체계를 callback 구조를 통해 구현할 수 있다.


//넘겨받은 callback 함수구조를 선언한다.
function hello(var1, var2, hi){
  const var1 = 1
  const var2 = 2
  
  hi(var1, var2)
}

//var1, var2 인자를 넘기는 callback 함수를 호출한다.
hello(1,2, (var1, var2)=>{
  console.log(var1, var2)
})

2. Closure

쉽게 말하면 함수의 return이 또 다른 함수형태로 되어있는 구조이다.

Closure의 중요한 개념은 외부함수 및 내부함수이며,
외부함수 내부적으로 내부함수가 선언되어 내부함수가 외부함수에서 선언된 변수 등을 참조/접근할 수 있다는 것이다.

  • 보통 return 값이 내부함수일때 외부함수의 변수에 접근할 수 있어 직관적으로 이해를 하기 위해선 위 개념을 기반으로 logic을 이해하면 좋을 것 같다.
  • 이때 사용하는 내부함수를 Closure라 한다.
function outer() {
  var x = 10;
  var inner = function () { console.log(x); };
  return inner;
}

var hiOuter = outer();
hiOuter(); // 10

위 logic에서 Clousre의 개념은 다음과 같다.

  • outer() 외부함수 내부에 inner() 함수가 선언되었다.
  • inner()함수는 자신이 선언된 공간(scope)인 outer() 함수 내 변수들을 접근 및 사용할 수 있다.
  • inner() 함수에서 사용하는 변수는, 자신이 선언된 공간이 외부함수 내에 존재하여 execution context 에 적재되어 참조가 가능한 변수이다.
  • inner()를 통해 outer()에 접근할 수 있고, 이를 Closure 함수라 한다.

outer()는 hiOuter에 내부 Clousre logic을 반환한 후 실행종료된 것처럼 보이지만(callstack에서 outer() 함수가 소멸되어 변수 x에 접근불가), 내부 Clousre 함수를 다시 한번 호출하여 변수 x를 참조할 수 있게 되었다.

2-1. 메모리 누수 관점에서의 Closure

이처럼 외부함수는 실행이 종료되었으나, 내부함수의 logic이 지속될 경우 외부함수에서 선언된 변수에 대해 지속적인 참조가 이루어진다.

이 과정에서 불필요한 변수가 참조되거나, 선언되었음에도 활용되지 않는 메모리 누수가 발생할 수 있기 때문에 이 점을 유의하면서 프로그래밍을 해야 한다.

3. 참조링크

https://edu.goorm.io/learn/lecture/557/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-node-js/lesson/21731/%ED%81%B4%EB%A1%9C%EC%A0%80

https://poiemaweb.com/js-closure

좋은 웹페이지 즐겨찾기