ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript のコールバック関数の詳細については、こちらをご覧ください。

JavaScript のコールバック関数の詳細については、こちらをご覧ください。

青灯夜游
青灯夜游転載
2021-01-15 10:40:522508ブラウズ

JavaScript のコールバック関数の詳細については、こちらをご覧ください。

関連する推奨事項: 「JavaScript ビデオ チュートリアル

コールバック関数は、すべてのフロントエンド プログラマが知っておくべき概念の 1 つです。コールバックは、配列、タイマー関数、Promise、およびイベント処理で使用できます。

この記事では、コールバック関数の概念について説明し、同期と非同期の 2 種類のコールバックを区別するのに役立ちます。

コールバック関数

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

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 つの方法があります。

同期コールバックは「ブロック」されています。コールバック関数が完了するまで、高階関数は実行を継続しません。

たとえば、

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)<pre class="brush:js;toolbar:false;">// Examples of synchronous callbacks on arrays const persons = [&amp;#39;Ana&amp;#39;, &amp;#39;Elena&amp;#39;]; persons.forEach( function callback(name) { console.log(name); } ); // logs &amp;#39;Ana&amp;#39; // logs &amp;#39;Elena&amp;#39; const nameStartingA = persons.find( function callback(name) { return name[0].toLowerCase() === &amp;#39;a&amp;#39;; } ); nameStartingA; // =&gt; &amp;#39;Ana&amp;#39; const countStartingA = persons.reduce( function callback(count, name) { const startsA = name[0].toLowerCase() === &amp;#39;a&amp;#39;; return startsA ? count + 1 : count; }, 0 ); countStartingA; // =&gt; 1</pre>String type

string.replace( callback )

メソッドは同期的に実行されるコールバックも受け入れることができます: <pre class="brush:js;toolbar:false;">// Examples of synchronous callbacks on strings const person = &amp;#39;Cristina&amp;#39;; // Replace &amp;#39;i&amp;#39; with &amp;#39;1&amp;#39; person.replace(/./g, function(char) { return char.toLowerCase() === &amp;#39;i&amp;#39; ? &amp;#39;1&amp;#39; : char; } ); // =&gt; &amp;#39;Cr1st1na&amp;#39;</pre>非同期コールバック

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

次の例では、

later()

関数の実行が 2 秒遅れます: <pre class="brush:js;toolbar:false;">console.log(&amp;#39;setTimeout() starts&amp;#39;); setTimeout(function later() { console.log(&amp;#39;later() called&amp;#39;); }, 2000); console.log(&amp;#39;setTimeout() completed&amp;#39;); // logs &amp;#39;setTimeout() starts&amp;#39; // logs &amp;#39;setTimeout() completed&amp;#39; // logs &amp;#39;later() called&amp;#39; (after 2 seconds)</pre>

later()

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

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

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

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

  • 非同期コールバックの例

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

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

setInterval(function repeat() {
  console.log(&#39;Every 2 seconds&#39;);
}, 2000);
// Each 2 seconds logs &#39;Every 2 seconds!&#39;

DOM イベント リスナー非同期でも呼び出されます イベント処理関数 (コールバック関数のサブタイプ):

const myButton = document.getElementById(&#39;myButton&#39;);

myButton.addEventListener(&#39;click&#39;, function handler() {
  console.log(&#39;Button clicked!&#39;);
});
// Logs &#39;Button clicked!&#39; when the button is clicked

4. 非同期コールバック関数と非同期関数

関数定義の前に特別なキーワード

async

を追加します。非同期関数を作成します: <pre class="brush:js;toolbar:false;">async function fetchUserNames() { const resp = await fetch(&amp;#39;https://api.github.com/users?per_page=5&amp;#39;); const users = await resp.json(); const names = users.map(({ login }) =&gt; login); console.log(names); }</pre><p><code>fetchUserNames() 是异步的,因为它以 async 为前缀。函数  await fetch('https://api.github.com/users?per_page=5') 从 GitHub 上获取前5个用户 。然后从响应对象中提取 JSON 数据:await resp.json()

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

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

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

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

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

const button = document.getElementById(&#39;fetchUsersButton&#39;);

button.addEventListener(&#39;click&#39;, fetchUserNames);

总结

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

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

同步回调是阻塞的。

异步回调是非阻塞的。

最后考考你:setTimeout(callback,0) 执行 callback 时是同步还是异步的?

更多编程相关知识,请访问:编程视频!!

以上がJavaScript のコールバック関数の詳細については、こちらをご覧ください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。