目次
1. コールバック関数
总结
ホームページ ウェブフロントエンド jsチュートリアル JavaScript のコールバック関数 (同期および非同期) の詳細な分析

JavaScript のコールバック関数 (同期および非同期) の詳細な分析

Aug 04, 2022 am 10:05 AM
javascript フロントエンド 折り返し電話

コールバック関数は、すべてのフロントエンド プログラマが知っておくべき概念の 1 つです。コールバックは、配列、タイマー関数、Promise、およびイベント処理で使用できます。この記事では、コールバック関数の概念を説明し、同期と非同期の 2 種類のコールバックを区別するのに役立ちます。

JavaScript のコールバック関数 (同期および非同期) の詳細な分析

1. コールバック関数

まず、人々に挨拶する関数を作成します。

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() 関数を呼び出し、その中のすべての要素を変換します。 array'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. 同期コールバック

コールバックを呼び出すには、

同期コールバックと非同期コールバックという 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() 開始'

  • ##コールバック関数の実行:
  • 'greet() が呼び出された'

  • 。最後に、高階関数は独自の実行プロセスを完了します:
  • ' map() completed'

#同期コールバックの例

多くのネイティブ JavaScript タイプのメソッドは同期コールバックを使用します。

最も一般的に使用されるメソッドは配列です。例:

array.map(callback)

array.forEach(callback)array.find(コールバック ), array.filter(callback), array.reduce(callback, init)<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// 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; // =&gt; 'Ana' const countStartingA = persons.reduce(   function callback(count, name) {    const startsA = name[0].toLowerCase() === 'a';     return startsA ? count + 1 : count;   },    0 ); countStartingA; // =&gt; 1</pre><div class="contentsignin">ログイン後にコピー</div></div>String type

string.replace( callback )

メソッドは同期的に実行されるコールバックも受け入れることができます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// Examples of synchronous callbacks on strings const person = 'Cristina'; // Replace 'i' with '1' person.replace(/./g,    function(char) {    return char.toLowerCase() === 'i' ? '1' : char;   } ); // =&gt; 'Cr1st1na'</pre><div class="contentsignin">ログイン後にコピー</div></div>

3. 非同期コールバック

非同期コールバックは「ノンブロッキング」です: 高次のコールバックは必要ありません関数 コールバックが完了するまで待って、実行を完了します。高階関数により、コールバックが特定のイベントで後で実行されることが保証されます。

次の例では、

later()

関数の実行が 2 秒遅れます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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)</pre><div class="contentsignin">ログイン後にコピー</div></div>

later()

は非同期関数です。 callback、setTimeout(later, 2000) は実行を開始して完了しますが、later() は 2 秒後に実行されるためです。 コールバックを非同期で呼び出す手順:

    高階関数の実行開始:
  • 'setTimeout()starts'

  • 高階関数は実行を完了します:
  • 'setTimeout() completed'

  • コールバック関数は 2 秒後に実行されます:
  • 'later( ) が呼び出されます'

非同期コールバックの例

タイマー関数はコールバックを非同期的に呼び出します:

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

は非同期関数を作成します: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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 }) =&gt; login);   console.log(names); }</pre><div class="contentsignin">ログイン後にコピー</div></div> <p><code>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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

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: フロントエンド開発ツールの完璧な組み合わせ 今日のインターネットの急速な発展の時代において、フロントエンド開発はますます重要になっています。 Web サイトやアプリケーションのエクスペリエンスに対するユーザーの要求がますます高まっているため、フロントエンド開発者は、より効率的で柔軟なツールを使用して、応答性の高いインタラクティブなインターフェイスを作成する必要があります。フロントエンド開発の分野における 2 つの重要なテクノロジーである PHP と Vue.js は、組み合わせることで完璧なツールと見なされます。この記事では、PHP と Vue の組み合わせと、読者がこれら 2 つをよりよく理解し、適用できるようにするための詳細なコード例について説明します。

フロントエンドの面接官からよく聞かれる質問 フロントエンドの面接官からよく聞かれる質問 Mar 19, 2024 pm 02:24 PM

フロントエンド開発のインタビューでは、HTML/CSS の基本、JavaScript の基本、フレームワークとライブラリ、プロジェクトの経験、アルゴリズムとデータ構造、パフォーマンスの最適化、クロスドメイン リクエスト、フロントエンド エンジニアリング、デザインパターン、新しいテクノロジーとトレンド。面接官の質問は、候補者の技術スキル、プロジェクトの経験、業界のトレンドの理解を評価するように設計されています。したがって、候補者はこれらの分野で自分の能力と専門知識を証明するために十分な準備をしておく必要があります。

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Jan 19, 2024 am 08:37 AM

Django は、迅速な開発とクリーンなメソッドを重視した Python で書かれた Web アプリケーション フレームワークです。 Django は Web フレームワークですが、Django がフロントエンドなのかバックエンドなのかという質問に答えるには、フロントエンドとバックエンドの概念を深く理解する必要があります。フロントエンドはユーザーが直接対話するインターフェイスを指し、バックエンドはサーバー側プログラムを指し、HTTP プロトコルを通じてデータと対話します。フロントエンドとバックエンドが分離されている場合、フロントエンドとバックエンドのプログラムをそれぞれ独立して開発して、ビジネス ロジックとインタラクティブ効果、およびデータ交換を実装できます。

Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Mar 28, 2024 pm 01:06 PM

Go 言語は、高速で効率的なプログラミング言語として、バックエンド開発の分野で広く普及しています。ただし、Go 言語をフロントエンド開発と結びつける人はほとんどいません。実際、フロントエンド開発に Go 言語を使用すると、効率が向上するだけでなく、開発者に新たな視野をもたらすことができます。この記事では、フロントエンド開発に Go 言語を使用する可能性を探り、読者がこの分野をよりよく理解できるように具体的なコード例を示します。従来のフロントエンド開発では、ユーザー インターフェイスの構築に JavaScript、HTML、CSS がよく使用されます。

Java のコールバック関数の基本構文と応用 Java のコールバック関数の基本構文と応用 Jan 30, 2024 am 08:12 AM

Java コールバック関数の基本的な書き方と使用法の紹介: Java プログラミングでは、コールバック関数は一般的なプログラミング パターンです。コールバック関数を通じて、メソッドをパラメータとして別のメソッドに渡し、それによってメソッドの間接的な呼び出しを実現できます。コールバック関数の使用は、イベント駆動型、非同期プログラミング、インターフェイス実装などのシナリオで非常に一般的です。この記事では、Java コールバック関数の基本的な書き方と使い方を紹介し、具体的なコード例を示します。 1. コールバック関数の定義 コールバック関数は、パラメータとして使用できる特殊な関数です。

Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Jan 19, 2024 am 08:52 AM

Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Django は、効率的でスケーラブルな Web アプリケーション フレームワークです。 MVCやMTVなど複数のWeb開発モデルをサポートし、高品質なWebアプリケーションを簡単に開発できます。 Django はバックエンド開発をサポートするだけでなく、フロントエンド インターフェイスを迅速に構築し、テンプレート言語を通じて柔軟なビュー表示を実現します。 Django はフロントエンド開発とバックエンド開発をシームレスに統合するため、開発者は学習に特化する必要がありません。

See all articles