私はガールフレンドにV8エンジンの「コールバック機能」について話しました!

コールバック関数は誰にとってもなじみのないものではありませんが、ガールフレンドには比較的馴染みがありません。コールバック関数とは何か、なぜこのように設計する必要があるのか​​、コールバック関数を使用するときに注意すべき点をガールフレンドに説明したい場合、それは本当に簡単ではありません。この記事。

JavaScriptでは、コールバック関数を理解することで、非同期プログラミング、メッセージループ、一般的に使用されるWeb API、Nodeでの非同期など、JavaScriptの他の設計を理解するのに役立つと個人的に思います。これらはすべてコールバック関数と密接に関連しているためです。ステップバイステップで学び、使用していきましょう。

あまりナンセンスな話をしないで、直接乾物に行ってください!

コールバック関数とは何ですか?

コールバック関数も一種の関数です。コールバック関数と通常の関数の違いは、呼び出しのタイミングにあります。いわゆるコールバック関数は、関数を別の関数のパラメーターとして受け取り、特定の時間にこの関数を呼び出すことです。この着信関数をコールバック関数と呼びます。

コールバック関数は、同期コールバックと非同期コールバックに分けられます。2つの違いは、通話の場所にあります。

1、

同期コールバック

いわゆる同期コールバック関数は、実行された関数内で呼び出されます。例えば:


1function fn(){
2    console.log("我是同步回调函数");
3}
4
5function bar(f){
6     f();
7}
8
9bar(fn);

コールバック関数fnを宣言し、bar関数を渡し、同期呼び出しであるbar内でfnを呼び出します。

2、

非同期コールバック

非同期コールバック関数は、実行された関数の外部で呼び出されます。次のコード:

1function fn(){
2    console.log("我是异步回调函数");
3}
4
5settimeout(fn, 1000);

上記のコードでは、settimeoutの最初のパラメーターfnは、渡されたコールバック関数です。プログラムが1000ミリ秒実行されると、このコールバック関数がこの時点で呼び出され、setTimeout関数の外部で呼び出されます。fnを非同期として呼び出します。折り返し電話。

JSスレッドアーキテクチャ

上記の問題、特に同期コールバック関数は非常に簡単に理解できます。しかし、現在、非同期コールバック関数がいつどこで呼び出されるかについては非常にあいまいです。

したがって、非同期コールバック関数のタイミングと場所を知るには、メッセージキューやイベントループなどのJSのスレッドアーキテクチャを理解し、JSがこれらをルートからどのように設計するかを理解する必要があります。

JSの元の設計はシングルスレッドです。いわゆるシングルスレッドとは、一度に1つのことしか実行できないことを意味し、JSが実行するシングルスレッドはページのUIスレッドです。結局、JSはDOMをより便利に操作するように設計されています。

私はガールフレンドにV8エンジンの「コールバック機能」について話しました!

次に問題が発生します。JSをUIページスレッドに設計すると、問題が発生します。ユーザーがページインタラクションを介してイベントを生成するときに、現在のスレッドが他のタスクを処理している場合、インタラクションイベントは現在のUIスレッドを待機する必要があります。タスクは処理後にのみ処理できるため、このデザインはより味がありません。

現在のUIスレッドが他のタスクを実行している場合、ユーザーのインタラクティブイベントタスクは処理されておらず、ページクリックが無効であるという錯覚が表示されます。

私はガールフレンドにV8エンジンの「コールバック機能」について話しました!

この問題を解決するために、GoogleV8チームはメッセージキューを導入しました。

メッセージキュー

メッセージキューを使用して、JavaScriptによって生成されたイベントであれ、ユーザーがページ操作をクリックして生成されたイベントであれ、生成されたすべてのイベントを統一された順序でメッセージキューに入れます。その後、UIスレッドはこのメッセージキューをループし続けます。タスクが取り出されて実行されます。

メッセージキューを使用すると、メインスレッドはさまざまなイベントタスクを順番に実行できます。上記はJSの基本的なUIスレッドアーキテクチャです。

非同期タスクはいつ呼び出されますか?

または、上記のsetTimeout非同期コールバック関数の例。現在のスレッドがメッセージキューからsetTimeoutコードを取り出して実行すると、fnのタスクが1000ミリ秒後に実行されることがわかります。1000ミリ秒後、メインスレッドはfnをイベントにカプセル化します。タスクはメッセージキューにスローされ、実行されるのを待ちます。

メッセージキューでの実行が特定のタイミングに達すると、カプセル化されたfnコールバック関数タスクが取り出され、メインスレッドで実行されます。

これを理解するのは難しいことではありませんが、特別な種類のコールバック関数があります。メインスレッドがメッセージキューからネットワークダウンロードタスクを取得する場合、ネットワークダウンロードには時間がかかります。メインスレッド内の他のタスクの実行をブロックすることはできないため、メインスレッドはネットワークスレッドに引き渡してダウンロードタスクを実行します。メインスレッドは、メッセージキューから他のタスクを取り出して、整然と実行し続けます。

私はガールフレンドにV8エンジンの「コールバック機能」について話しました!

このとき、ネットワークスレッドはこのタスクを受け入れてダウンロード操作を実行します。ネットワークスレッドがファイルのダウンロードを完了すると、ダウンロード結果をイベントタスクにカプセル化し、メッセージキューに入れます。メインスレッドがこのタスクを実行すると、ネットワークスレッドがダウンロードを終了したことがわかり、ダウンロード結果がユーザーに表示されます。

やっと

さて、今日は主にJavaScriptのコールバック関数の起源と非同期コールバック関数の設計について説明します。これもV8エンジンのごく一部です。次に、このような知識ポイントを使用して、V8Googleエンジンのすべての側面を探ります。優れたデザインスキーム。

おすすめ

転載: blog.51cto.com/15064450/2597982