React

콜백 함수

Lulung 2024. 12. 19. 14:19

콜백 함수(callback function)는 다른 함수에 인자로 전달되어 나중에 실행되는 함수다. 즉, 어떤 작업이 완료되었을 때 실행될 함수를 미리 정의해 놓고, 그 함수가 필요한 순간에 호출하는 등의 비동기적 또는 지연된 실행을 위해 사용된다.

예시

// 기본적인 콜백 함수 예시
function greet(name) {
  console.log("Hello, " + name);
}

function sayHello(callback) {
  callback("Alice");
}

// sayHello 함수에서 greet 함수가 콜백으로 사용됨
sayHello(greet); // "Hello, Alice" 출력

여기서 greet는 콜백 함수다. sayHello 함수는 greet를 인자로 받으면서 greet를 호출한다. 즉, sayHello가 실행될 때 greet가 실행된다.

 

콜백 함수와 비동기 작업

콜백 함수는 특히 서버에서 데이터를 가져오는 등의 비동기 작업에서 많이 사용된다. 

예시

// setTimeout을 사용한 비동기 예시
function fetchData(callback) {
  setTimeout(() => {
    console.log("Data fetched!");
    callback();
  }, 2000); // 2초 후에 실행되는 비동기 작업
}

function processData() {
  console.log("Processing data...");
}

fetchData(processData); // 2초 후에 "Data fetched!"와 "Processing data..." 출력

 

이벤트 리스너에서의 콜백 함수

이벤트가 발생했을 때 특정 동작을 실행하는 함수를 콜백으로 등록한다.

예시

// 버튼 클릭 시 콜백 함수 실행
const button = document.getElementById("myButton");

button.addEventListener("click", function() {
  console.log("Button clicked!");
});

 

주의 사항

1. 콜백 헬(Callback Hell) : 여러 개의 콜백이 중첩되면서 코드가 복잡해지면 가독성과 유지보수 측면에서 문제가 생기니 주의한다. 

// 예시: 콜백 헬
asyncTask1(function() {
  asyncTask2(function() {
    asyncTask3(function() {
      // 계속 중첩되는 콜백들
    });
  });
});

2. 에러 처리 어려움 : 콜백 안에서 발생할 수 있는 에러를 처리하기 어렵다.

 

콜백 함수와 this

콜백 함수에서 this는 함수를 호출하는 컨텍스트에 따라 달라진다. 예를 들어, 일반 함수와 메서드에서의 this가 다르게 동작한다.

예시

function MyClass() {
  this.name = "Alice";
  setTimeout(function() {
    console.log(this.name); // undefined, 일반 함수에서의 `this`
  }, 1000);
}

const obj = new MyClass();

setTimeout 안의 콜백 함수는 일반 함수로 호출 되어 this가 전역 객체를 가리키게 된다.

function MyClass() {
  this.name = "Alice";
  setTimeout(() => {
    console.log(this.name); // "Alice", 화살표 함수에서는 `this`가 상위 스코프를 참조
  }, 1000);
}

이 경우에는 setTimeout 안의 함수가 화살표 함수이기 때문에 this가 상위 스코프를 참조하여 Alice를 출력하게 된다.

'React' 카테고리의 다른 글

일반함수 / 화살표 함수 / 메서드 차이  (1) 2024.12.19
동기와 비동기  (0) 2024.12.19
useRef란?  (0) 2024.12.19
useState란?  (0) 2024.12.19
useEffect란?  (0) 2024.12.19