목차
1. 콜백 함수
2、同步回调
同步回调的例子
3、异步回调
异步回调的例子
4、异步回调函数与异步函数
🎜동기 콜백의 예🎜
🎜비동기 콜백의 예🎜
总结
웹 프론트엔드 JS 튜토리얼 JavaScript의 콜백 함수에 대한 심층 분석(동기 및 비동기)

JavaScript의 콜백 함수에 대한 심층 분석(동기 및 비동기)

Aug 04, 2022 am 10:05 AM
javascript 프런트 엔드 콜백 함수

콜백 함수는 모든 프론트엔드 프로그래머가 알아야 할 개념 중 하나입니다. 콜백은 배열, 타이머 함수, 약속 및 이벤트 처리에 사용될 수 있습니다. 이 문서에서는 콜백 함수의 개념을 설명하고 두 가지 유형의 콜백(동기 및 비동기)을 구별하는 데 도움을 줍니다.

JavaScript의 콜백 함수에 대한 심층 분석(동기 및 비동기)

1. 콜백 함수

먼저 인사하는 함수를 작성하세요.

name 매개변수를 허용하는 greet(name) 함수를 만드세요. 이 함수는 다음과 같은 인사말 메시지를 반환해야 합니다. name 参数的函数 greet(name)。这个函数应返回打招呼的消息:

function greet(name) {
  return `Hello, ${name}!`;
}

greet('Cristina'); // => 'Hello, Cristina!'
로그인 후 복사

如果向很多人打招呼该怎么办?可以用特殊的数组方法  array.map() 可以实现:

const persons = ['Cristina', 'Ana'];

const messages = persons.map(greet);
messages; // => ['Hello, Cristina!', 'Hello, Ana!']
로그인 후 복사

persons.map(greet) 获取 persons 数组的所有元素,并分别用每个元素作为调用参数来调用 greet() 函数:`greet('Cristina'), greet('Ana')

有意思的是 persons.map(greet) 方法可以接受 greet()  函数作为参数。这样 greet()  就成了回调函数

persons.map(greet) 是用另一个函数作为参数的函数,因此被称为高阶函数

回调函数作为高阶函数的参数,高阶函数通过调用回调函数来执行操作。

重要的是高阶函数负责调用回调,并为其提供正确的参数。

在前面的例子中,高阶函数 persons.map(greet) 负责调用  greet()  函数,并分别把数组中所有的元素 'Cristina'Ana ' 作为参数。

这就为识别回调提供了一条简单的规则。如果你定义了一个函数,并将其作参数提供给另一个函数的话,那么这就创建了一个回调。

你可以自己编写使用回调的高阶函数。下面是 array.map() 方法的等效版本:

function map(array, callback) {
  const mappedArray = [];
  for (const item of array) { 
    mappedArray.push(
      callback(item)    );
  }
  return mappedArray;
}

function greet(name) {
  return `Hello, ${name}!`;
}

const persons = ['Cristina', 'Ana'];

const messages = map(persons, greet);messages; // => ['Hello, Cristina!', 'Hello, Ana!']
로그인 후 복사

map(array, callback) 是一个高阶函数,因为它用回调函数作为参数,然后在其主体内部调用该回调函数:callback(item)

注意,常规函数(用关键字 function 定义)或箭头函数(用粗箭头 => 定义)同样可以作为回调使用。

2、同步回调

回调的调用方式有两种:同步异步回调。

同步回调是“阻塞”的:高阶函数直到回调函数完成后才继续执行。

例如,调用 map()greet() 函数。

function map(array, callback) {
  console.log('map() starts');
  const mappedArray = [];
  for (const item of array) { mappedArray.push(callback(item)) }
  console.log('map() completed');
  return mappedArray;
}

function greet(name) {
  console.log('greet() called');
  return `Hello, ${name}!`;
}

const persons = ['Cristina'];

map(persons, greet);
// logs 'map() starts'
// logs 'greet() called'
// logs 'map() completed'
로그인 후 복사

其中 greet()  是同步回调。

同步回调的步骤:

  • 高阶函数开始执行:'map() starts'

  • 回调函数执行:'greet() called'

  • .最后高阶函数完成它自己的执行过程:'map() completed'

同步回调的例子

许多原生 JavaScript 类型的方法都使用同步回调。

最常用的是 array 的方法,例如: array.map(callback), array.forEach(callback), array.find(callback), array.filter(callback), array.reduce(callback, init)

// Examples of synchronous callbacks on arrays
const persons = ['Ana', 'Elena'];

persons.forEach(
  function callback(name) {    console.log(name);
  }
);
// logs 'Ana'
// logs 'Elena'

const nameStartingA = persons.find(
  function callback(name) {    return name[0].toLowerCase() === 'a';
  }
);
nameStartingA; // => 'Ana'

const countStartingA = persons.reduce(
  function callback(count, name) {    const startsA = name[0].toLowerCase() === 'a';
    return startsA ? count + 1 : count;
  }, 
  0
);
countStartingA; // => 1
로그인 후 복사

字符串类型的 string.replace(callback)  方法也能接受同步执行的回调:

// Examples of synchronous callbacks on strings
const person = 'Cristina';

// Replace 'i' with '1'
person.replace(/./g, 
  function(char) {    return char.toLowerCase() === 'i' ? '1' : char;
  }
); // => 'Cr1st1na'
로그인 후 복사

3、异步回调

异步回调是“非阻塞的”:高阶函数无需等待回调完成即可完成其执行。高阶函数可确保稍后在特定事件上执行回调。

在以下的例子中,later() 函数的执行延迟了 2 秒:

console.log('setTimeout() starts');
setTimeout(function later() {
  console.log('later() called');
}, 2000);
console.log('setTimeout() completed');

// logs 'setTimeout() starts'
// logs 'setTimeout() completed'
// logs 'later() called' (after 2 seconds)
로그인 후 복사

later() 是一个异步回调,因为 setTimeout(later,2000) 启动并完成了执行,但是 later() 在 2 秒后执行。

异步调用回调的步骤:

  • 高阶函数开始执行:'setTimeout()starts'

  • 高阶函数完成其执行: 'setTimeout() completed'

  • 回调函数在 2 秒钟后执行: 'later() called'

异步回调的例子

计时器函数异步调用回调:

setTimeout(function later() {
  console.log('2 seconds have passed!');
}, 2000);
// After 2 seconds logs '2 seconds have passed!' 

setInterval(function repeat() {
  console.log('Every 2 seconds');
}, 2000);
// Each 2 seconds logs 'Every 2 seconds!'
로그인 후 복사

DOM 事件侦听器还异步调用事件处理函数(回调函数的子类型):

const myButton = document.getElementById('myButton');

myButton.addEventListener('click', function handler() {
  console.log('Button clicked!');
});
// Logs 'Button clicked!' when the button is clicked
로그인 후 복사

4、异步回调函数与异步函数

在函数定义之前加上特殊关键字 async

async function fetchUserNames() {
  const resp = await fetch('https://api.github.com/users?per_page=5');
  const users = await resp.json();
  const names = users.map(({ login }) => login);
  console.log(names);
}
로그인 후 복사
로그인 후 복사
많은 사람에게 인사하면 어떻게 되나요? 특수 배열 메소드 array.map()을 사용하여 다음을 달성할 수 있습니다. 🎜
const button = document.getElementById('fetchUsersButton');

button.addEventListener('click', fetchUserNames);
로그인 후 복사
로그인 후 복사
🎜persons.map(greet) persons의 모든 요소 가져오기 > 배열을 사용하고 각 요소를 호출 매개변수로 사용하여 greet() 함수를 호출합니다. `greet('Cristina'), greet('Ana'). 🎜🎜흥미롭게도 <code>persons.map(greet) 메서드는 greet() 함수를 매개변수로 받아들일 수 있습니다. 이런 식으로 greet()는 🎜콜백 함수🎜가 됩니다. 🎜🎜persons.map(greet)는 다른 함수를 매개변수로 받는 함수이므로 🎜고차 함수🎜라고 합니다. 🎜
콜백 함수고차 함수의 매개변수로 사용되며, 고차 함수는 콜백 함수를 호출하여 연산을 수행합니다.
🎜중요한 것은 고차 함수가 콜백을 호출하고 올바른 매개변수를 제공하는 역할을 한다는 것입니다. 🎜🎜이전 예에서 고차 함수 persons.map(greet)greet() 함수를 호출하고 배열 ' Cristina' 및 Ana '를 매개변수로 사용합니다. 🎜🎜이는 콜백을 식별하는 간단한 규칙을 제공합니다. 함수를 정의하고 이를 다른 함수에 매개변수로 제공하면 콜백이 생성됩니다. 🎜🎜콜백을 사용하여 자신만의 고차 함수를 작성할 수 있습니다. 다음은 array.map() 메서드의 해당 버전입니다. 🎜rrreee🎜map(array, callback)은 콜백 함수를 다음과 같이 사용하므로 고차 함수입니다. 매개변수, 콜백 함수는 본문(callback(item)) 내부에서 호출됩니다. 🎜🎜일반 함수(function 키워드로 정의됨) 또는 화살표 함수(굵은 화살표 =>로 정의됨)도 콜백으로 사용할 수 있습니다. 🎜🎜🎜2. 동기 콜백 🎜🎜🎜콜백 방법에는 🎜동기🎜 및 🎜비동기🎜콜백 두 가지가 있습니다. 🎜🎜동기식 콜백은 "차단"됩니다. 고차 함수는 콜백 함수가 완료될 때까지 실행을 계속하지 않습니다. 🎜🎜예를 들어 map()greet() 함수를 호출하세요. 🎜rrreee🎜여기서 greet()는 동기 콜백입니다. 🎜🎜동기 콜백 단계: 🎜
  • 🎜고차 함수 실행 시작: 'map() start'🎜 li >
  • 🎜콜백 함수 실행: 'greet() 호출됨'🎜
  • 🎜 마지막으로 고차 함수는 자체 실행 프로세스를 완료합니다: ' map() 완료됨'🎜

🎜동기 콜백의 예🎜

🎜많은 기본 JavaScript 유형 메서드는 동기 콜백을 사용합니다. 🎜🎜가장 일반적으로 사용되는 방법은 배열입니다. 예: array.map(callback), array.forEach(callback), array.find(callback) , array.filter(callback), array.reduce(callback, init)🎜rrreee🎜string.replace(callback) 이 메서드는 동기적으로 실행되는 콜백도 허용할 수 있습니다. 🎜rrreee🎜🎜3. 비동기 콜백 🎜🎜🎜비동기 콜백은 "비차단"입니다. 고차 함수는 콜백이 완료될 때까지 기다리지 않고 실행을 완료할 수 있습니다. 고차 함수는 나중에 특정 이벤트에서 콜백이 실행되도록 보장합니다. 🎜🎜다음 예에서는 <code>later() 함수의 실행이 2초 지연됩니다. 🎜rrreee🎜later()setTimeout이므로 비동기 콜백입니다. (나중, 2000)은 실행을 시작하고 완료하지만 later()는 2초 후에 실행됩니다. 🎜🎜콜백을 비동기식으로 호출하는 단계: 🎜
  • 🎜고차 함수 실행 시작: 'setTimeout()starts'🎜 li>
  • 🎜고차 함수 실행 완료: 'setTimeout() 완료'🎜
  • 🎜콜백 함수는 2초 후에 실행됩니다: 'later( ) 호출됨'🎜

🎜비동기 콜백의 예🎜

🎜Timer 함수는 콜백을 비동기적으로 호출합니다.🎜rrreee🎜DOM 이벤트 리스너는 이벤트 핸들러도 호출합니다. 비동기 함수(콜백 함수의 하위 유형): 🎜rrreee🎜🎜4. 비동기 콜백 함수 및 비동기 함수 🎜🎜🎜 함수 정의 앞에 특수 키워드 async를 추가하면 비동기 함수가 생성됩니다. 🎜
async function fetchUserNames() {
  const resp = await fetch('https://api.github.com/users?per_page=5');
  const users = await resp.json();
  const names = users.map(({ login }) => login);
  console.log(names);
}
로그인 후 복사
로그인 후 복사

fetchUserNames() 是异步的,因为它以 async 为前缀。函数  await fetch('https://api.github.com/users?per_page=5') 从 GitHub 上获取前5个用户 。然后从响应对象中提取 JSON 数据:await resp.json()

异步函数是 promise 之上的语法糖。当遇到表达式 await <promise>  (调用  fetch()  会返回一个promise)时,异步函数会暂停执行,直到 promise 被解决。

异步回调函数和异步函数是不同的两个术语。

异步回调函数由高阶函数以非阻塞方式执行。但是异步函数在等待 promise(await <promise>)解析时会暂停执行。

但是你可以把异步函数用作异步回调!

让我们把异步函数 fetch UserNames() 设为异步回调,只需单击按钮即可调用:

const button = document.getElementById('fetchUsersButton');

button.addEventListener('click', fetchUserNames);
로그인 후 복사
로그인 후 복사

总结

回调是一个可以作为参数传给另一个函数(高阶函数)执行的函数。

回调函数有两种:同步和异步。

  • 同步回调是阻塞的。

  • 异步回调是非阻塞的。

【相关推荐:javascript学习教程

위 내용은 JavaScript의 콜백 함수에 대한 심층 분석(동기 및 비동기)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java 콜백 함수를 작성하는 방법 Java 콜백 함수를 작성하는 방법 Jan 09, 2024 pm 02:24 PM

Java 콜백 함수의 작성 방법은 다음과 같습니다. 1. 인터페이스 콜백, 콜백 메소드가 포함된 인터페이스를 정의하고 콜백을 트리거해야 하는 매개변수로 인터페이스를 사용하고 적절한 시간에 콜백 메소드를 호출합니다. 익명 내부 클래스 콜백, 익명 내부 클래스를 사용하여 콜백 함수를 구현하면 추가 구현 클래스 생성을 피할 수 있습니다. 3. 람다 표현식 콜백 Java 8 이상에서는 람다 표현식을 사용하여 콜백 함수 작성을 단순화할 수 있습니다.

PHP와 Vue: 프런트엔드 개발 도구의 완벽한 조합 PHP와 Vue: 프런트엔드 개발 도구의 완벽한 조합 Mar 16, 2024 pm 12:09 PM

PHP와 Vue: 프론트엔드 개발 도구의 완벽한 조합 오늘날 인터넷이 빠르게 발전하는 시대에 프론트엔드 개발은 점점 더 중요해지고 있습니다. 사용자가 웹 사이트 및 애플리케이션 경험에 대한 요구 사항이 점점 더 높아짐에 따라 프런트 엔드 개발자는 보다 효율적이고 유연한 도구를 사용하여 반응형 및 대화형 인터페이스를 만들어야 합니다. 프론트엔드 개발 분야의 두 가지 중요한 기술인 PHP와 Vue.js는 함께 사용하면 완벽한 도구라고 볼 수 있습니다. 이 기사에서는 독자가 이 두 가지를 더 잘 이해하고 적용할 수 있도록 PHP와 Vue의 조합과 자세한 코드 예제를 살펴보겠습니다.

프론트엔드 면접관이 자주 묻는 질문 프론트엔드 면접관이 자주 묻는 질문 Mar 19, 2024 pm 02:24 PM

프론트엔드 개발 인터뷰에서 일반적인 질문은 HTML/CSS 기초, JavaScript 기초, 프레임워크 및 라이브러리, 프로젝트 경험, 알고리즘 및 데이터 구조, 성능 최적화, 크로스 도메인 요청, 프론트엔드 엔지니어링, 디자인 패턴, 새로운 기술 및 트렌드. 면접관 질문은 후보자의 기술적 능력, 프로젝트 경험, 업계 동향에 대한 이해를 평가하기 위해 고안되었습니다. 따라서 지원자는 자신의 능력과 전문성을 입증할 수 있도록 해당 분야에 대한 충분한 준비를 갖추어야 합니다.

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 Jan 05, 2024 pm 06:08 PM

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

Django는 프론트엔드인가요, 백엔드인가요? 확인 해봐! Django는 프론트엔드인가요, 백엔드인가요? 확인 해봐! Jan 19, 2024 am 08:37 AM

Django는 빠른 개발과 깔끔한 ​​방법을 강조하는 Python으로 작성된 웹 애플리케이션 프레임워크입니다. Django는 웹 프레임워크이지만 Django가 프런트엔드인지 백엔드인지에 대한 질문에 답하려면 프런트엔드와 백엔드의 개념에 대한 깊은 이해가 필요합니다. 프론트엔드는 사용자가 직접 상호작용하는 인터페이스를 의미하고, 백엔드는 HTTP 프로토콜을 통해 데이터와 상호작용하는 서버측 프로그램을 의미합니다. 프론트엔드와 백엔드가 분리되면 프론트엔드와 백엔드 프로그램을 독립적으로 개발하여 각각 비즈니스 로직과 인터랙티브 효과, 데이터 교환을 구현할 수 있습니다.

Java 콜백 함수의 기본 구문 및 적용 Java 콜백 함수의 기본 구문 및 적용 Jan 30, 2024 am 08:12 AM

Java 콜백 함수의 기본 작성 및 사용법 소개: Java 프로그래밍에서 콜백 함수는 일반적인 프로그래밍 패턴입니다. 콜백 함수를 통해 메소드를 매개변수로 다른 메소드에 전달하여 메소드를 간접적으로 호출할 수 있습니다. 콜백 함수의 사용은 이벤트 중심, 비동기 프로그래밍 및 인터페이스 구현과 같은 시나리오에서 매우 일반적입니다. 이 기사에서는 Java 콜백 함수의 기본 작성 및 사용법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 콜백 함수의 정의 콜백 함수는 매개변수로 사용할 수 있는 특수 함수입니다.

Go 언어 프런트엔드 기술 탐색: 프런트엔드 개발을 위한 새로운 비전 Go 언어 프런트엔드 기술 탐색: 프런트엔드 개발을 위한 새로운 비전 Mar 28, 2024 pm 01:06 PM

빠르고 효율적인 프로그래밍 언어인 Go 언어는 백엔드 개발 분야에서 널리 사용됩니다. 그러나 Go 언어를 프런트엔드 개발과 연관시키는 사람은 거의 없습니다. 실제로 프런트엔드 개발에 Go 언어를 사용하면 효율성이 향상될 뿐만 아니라 개발자에게 새로운 지평을 열어줄 수도 있습니다. 이 기사에서는 프런트엔드 개발에 Go 언어를 사용할 수 있는 가능성을 살펴보고 독자가 이 영역을 더 잘 이해할 수 있도록 구체적인 코드 예제를 제공합니다. 전통적인 프런트엔드 개발에서는 사용자 인터페이스를 구축하기 위해 JavaScript, HTML, CSS를 사용하는 경우가 많습니다.

Golang과 프런트엔드 기술의 결합: Golang이 프런트엔드 분야에서 어떤 역할을 하는지 살펴보세요. Golang과 프런트엔드 기술의 결합: Golang이 프런트엔드 분야에서 어떤 역할을 하는지 살펴보세요. Mar 19, 2024 pm 06:15 PM

Golang과 프런트엔드 기술의 결합: Golang이 프런트엔드 분야에서 어떤 역할을 하는지 살펴보려면 구체적인 코드 예제가 필요합니다. 인터넷과 모바일 애플리케이션의 급속한 발전으로 인해 프런트엔드 기술이 점점 더 중요해지고 있습니다. 이 분야에서는 강력한 백엔드 프로그래밍 언어인 Golang도 중요한 역할을 할 수 있습니다. 이 기사에서는 Golang이 프런트엔드 기술과 어떻게 결합되는지 살펴보고 특정 코드 예제를 통해 프런트엔드 분야에서의 잠재력을 보여줍니다. 프론트엔드 분야에서 Golang의 역할은 효율적이고 간결하며 배우기 쉬운 것입니다.

See all articles