次の関数が実行されていると考えてください。
function loadPage()
{
takeInput();
processInput();
outputInput();
}
それらはどのような順序で実行されますか(スタックに続くことを読んだので、オプション2が答えになります)?
オプション1
- takeInput();
- processInput();
- 出力入力();
オプション#2
- 出力入力();
- processInput();
- takeInput();
次の関数が実行されていると考えてください。
function loadPage()
{
takeInput();
processInput();
outputInput();
}
それらはどのような順序で実行されますか(スタックに続くことを読んだので、オプション2が答えになります)?
オプション1
オプション#2
JavaScript 関数は非同期ではありません。一部の非常に限られた関数セットには、非同期 API があります。
addEventListener, setTimeout, setInterval. これらは 3 つだけです (これは非常に驚くべきことだと思いました)。
最終的に呼び出される可能性のあるコールバックを渡すことができます。タイマーが切れたとき、ユーザーが何かをクリックしたとき、または AJAX 要求が完了したときなど。
JavaScript にはイベント ループがあります。イベント ループは、各イベントを受信時に処理します。ボタンを 3 回クリックしてからタイマーが切れると、イベントが処理される順序になります。それはすべて非常に明確に定義され、決定されています。
さらに、JavaScript にはスレッドがありません。次のイベントを開始する前に、何もすることがなくなる (戻る) まで、1 つのイベントを完全に実行します。したがって、イベントが干渉することは決してありません。これにより、データの状態について非常に強力な仮定を立てることができます。
JavaScript 関数は非同期ですか?
一部はそうですが、ほとんどはそうではありません。
それらはどのような順序で実行されますか
これらは、呼び出された順序で実行されます。それらはすべて同じ関数から呼び出されるため、単純な線形順序になります。
それらのいずれかが非同期で記述されている場合、すべてのアクティビティが同じ順序で終了しない可能性があります。例: _
function a() {
console.log('a');
}
function b() {
console.log('b');
}
function c() {
console.log('c');
}
function aAsync() {
setTimeout(a, 500);
}
function load() {
aAsync();
b();
c();
}
load();
Javascript はAsynchronousではありません。
同期的に動作します。つまり、一度に 1 行のコードを実行します。JavaScript コードが実行されると、まずグローバル実行コンテキストが作成され、グローバル実行コンテキストから関数を呼び出すと、JavaScript エンジンによって別の実行コンテキストが作成され、実行スタックの一番上に配置されます (グローバル実行コンテキストは既にスタック内)、その関数内から別の関数が呼び出されている場合、別の実行コンテキストが作成され、スタック サイズが増加し続けます。
そのため、javascript エンジンはこのコードを一度に 1 行ずつ実行し続け、そのプロセスでイベント/ http 要求が発生した場合、ブラウザーはそれらをEVENT QUEUEに入れます。つまり、ポイントは、実行スタックが空になるまで、JavaScript エンジンがキュー内のイベントを処理しないことです。エンジンは、実行スタックの処理が完了すると、キューに現在のイベントのイベント ハンドラーがあるかどうかを定期的に調べ、同様にそのハンドラーの実行コンテキストを作成し、その中でコードを実行します。したがって、プロセス全体は同期的であり、非同期性はブラウザーの他の部分 (レンダリング エンジンや http エンジン) によって処理され、JavaScript エンジンはコードを同期的に実行し続けます。
したがって、あなたのケースでは、loadpageが呼び出されたコンテキスト関数から、その実行コンテキストが作成され、スタックの一番上に配置されました。次に、takeinput関数、その exec を呼び出します。context が作成され、その他の関数 context は作成されず、実行スタックから takeinput コンテキストが取り出されるまでスタックに配置されません。したがって、正しい順序は、takeinput、processinput、および outputinput になります。
あなたの質問に答えてくれることを願っています。
JavaScript は一般に非同期ではありませんが、非同期およびイベント駆動型のメソッドがあります。
Ajax 呼び出しは、大きな非同期メソッドです。
イベントの場合、実行順序について保証できるかどうかはわかりませんが、それについては間違っている可能性があります。
いいえ、非同期メソッドはありますが、デフォルト/標準ではありません。そして、jQuery は、非同期動作をさらに活用します。ただし、いずれも主観的なものであり、「JavaScript のすべてがこれであれ」であるとは言えません。
メソッドは常に呼び出された順序で実行されます。それらの非同期性は、後で呼び出されたとしても、いずれかが別の前に完了する可能性があることを意味します。
Javascript はシングル スレッドの獣であるため、コードを実行するために子スレッドを生成するという点で考えられるように、厳密に言えば、タスクは非同期ではありません。これを提供するメカニズムは、非同期性の錯覚を生み出しますが、それでもシングルスレッドです。