0

JavaScript タイムラインの実行フェーズ中に、登録されたイベント ハンドラーを非同期的に呼び出すイベントが発生します。非同期呼び出しに関する私の知識によると、プログラムの実行はタスクの完了を待たず、代わりに次のタスクに移動します。では、JavaScript が発生時に単一のイベントに登録された 2 つのイベント ハンドラー関数の非同期実行をどのように処理するのか、誰でも説明できますか?

For eg:
    window.addEventListener("load",function(){console.log("onload event 1 called!");},false);
    window.addEventListener("load",function(){console.log("onload event 2 called!");},false);

JavaScriptインタープリターは最初のイベントハンドラーを呼び出して2番目のイベントハンドラーに移動し、最初のイベントハンドラーの実行部分は別のスレッドによって実行されますか?

そして、javascriptがシングルスレッドモデルに従っていると読んだことがありますが、それはどのように適合しますか?

4

2 に答える 2

2

非同期呼び出しに関する私の知識によると、プログラムの実行はタスクの完了を待たず、代わりに次のタスクに移動します。

イベントが発生するのを待つと、非同期呼び出しが発生します。JavaScript エンジンは、そのイベントが非同期コールバックをトリガーするまで、他のタスクを続行します。

JavaScriptインタープリターは最初のイベントハンドラーを呼び出して、2番目のイベントハンドラーに移動しますか?

はい

最初のイベント ハンドラの実行部分は、別のスレッドによって実行されます

いいえ。機能は同時にではなく、順番に実行されます。

そして、javascriptがシングルスレッドモデルに従っていると読んだことがありますが、それはどのように適合しますか?

これにより、順次操作が強制されます。

于 2015-10-17T16:34:12.620 に答える
0

Javascript はシングル スレッドであるため、常に 1 つの JavaScript コードのみが実行されます。ただし、ブラウザ自体はマルチスレッドです。これは、javascript alert() を呼び出す点滅する CSS を含むページを作成することで確認できます。JavaScript がユーザーが [OK] をクリックするのを待っている間でも、テキストは点滅し続けます。

これにより、JavaScript スレッドが占有されていても、ブラウザーはイベントをキューに入れることができます。これが該当することは、次のコードで確認できます。

function clickit()
{
    var start = Date.now();
    do
    {
    } while(Date.now() < start + 3000);
    console.log("done",start,Date.now());
}

...

<body onclick="clickit()"></body>

このページがすばやくクリックされると、次の結果が生成されます。

done 1445104179091 1445104182091
done 1445104182098 1445104185098
done 1445104185099 1445104188099
done 1445104188099 1445104191099
done 1445104191099 1445104194099

ご覧のとおり、最初のクリック後、3 秒が経過するまで JavaScript スレッドは完全にビジー状態でしたが、ブラウザ スレッドは引き続き機能し、追加のクリック イベントをキューに入れることができ、clickit() 関数が終了するとすぐに実行されました。

あなたの例では、ページが読み込まれると、ブラウザ スレッドは 2 つのイベントを JavaScript のイベント キューに配置します。次に、JavaScript がアイドル状態であるため、イベント キューの処理が開始されます。先頭から開始し、最初の関数を処理します。それが終了すると、アイドル状態に戻り、イベント キューの処理に戻ります。この時点で 2 番目の関数は最上位にあるため、2 番目の関数を実行します。

于 2015-10-17T17:58:17.470 に答える