この記事では、javascript に関する関連知識を提供します。主に JavaScript イベント ループの同期タスクと非同期タスクを紹介します。この記事では、このトピックに関する詳細な紹介が提供されており、一定の参考価値があります。それを参照できます。
[関連する推奨事項: JavaScript ビデオ チュートリアル 、Web フロントエンド ]
序文
まず、js の同期と非同期の問題について学ぶ前に、js がシングルスレッドであることを理解する必要があります。なぜシングルスレッドである必要があるのでしょうか?これは使用シナリオによって異なりますが、主にユーザーがページを操作できるようにするために使用されます。 js がマルチスレッドであると仮定すると、このスレッドではユーザーがボタンをクリックして DOM ノードが追加され、別のスレッドではユーザーがボタンをクリックして DOM ノードが削除されます。その場合、js は何をリッスンすればよいのかわかりません。今度は誰の。では、同期と非同期が登場する理由は何でしょうか?非同期がないとすると、サーバーにデータをリクエストすると、ネットワークの状態が悪くて長時間停止する可能性がありますが、このとき、Web ページは同期なので、データリクエストが戻ってくるまで待つ必要があります。ユーザーとの対話を続けることができます。これにより、Web ページ全体が非常に忙しくなり、奇妙にスタックし、ユーザー エクスペリエンスが非常に悪くなります。
実行スタックとタスクキュー
実行スタック
実行スタックとは何かという話ではなく、スタックとは何かについて話しましょう。スタックはバケツのようなもので、最初に入れたものが最後に取り出される必要があります。これは、よく「先入れ後出し」と呼ばれるものです。
# 次に、実行スタックが画像内のコンテンツ ブロックをコード タスクに変換します。 :
function fn (count) { if (count <= 0) return fn(count - 1) console.log(count) } fn(3)これは非常に単純な再帰コードです。ここでは図で直接説明します (実際、ここでの図は厳密ではありません。スタックの一番下にある必要があります)グローバル実行コンテキストになります):
。 (これを覚えておいてください!!!)
タスクキュー この場合、キューとスタックは逆になり、キューは先入れ先出しになります。実は、これはわかりやすいのですが、通常の行列と同じで、最初に列に入った人が先に出なければなりません。次に、タスク キューの一般的な理解は、非同期タスクのコールバック関数を配置するために使用されます。 (これも覚えておいてください!!!)
同期タスクと非同期タスク概念的なものから始めて基礎を築きましょう:
同期タスク同期タスクを理解するときに、そのセマンティクスによって混乱する人が多くいますが、実際には、同期タスクは同時に実行されません。これは、次のタスクを実行する前に、前の実行タスクが終了するのを待つことです。ここで言うのは曖昧ではありませんが、説明するために簡単なコードを書いてみましょう:console.log(1) console.log(2) console.log(3)コードは非常に単純です。当然のことです。出力結果は
1, 2, 3 です。これが同期コードです。次に要約します。同期タスクはメインスレッドのキューに入れられ、1 つずつ実行スタックに入力されます実行スタックが空になるまで実行されます。
非同期タスク直接的な例を示します:
console.log(1) setTimeout(() => { console.log(2) }, 1000) console.log(3)このコードの出力は、上記の同期コードの出力とは異なります。 order is
1, 3, 2. This is asynchronous code. It will not be created in the order of execution.
同様に、公式の言葉で要約しましょう: 非同期タスクとは、メインスレッドには入らず「タスクキュー」(イベントキュー)に入るタスクを指します。「タスクキュー」がメインスレッドに非同期タスクの実行可能を通知した場合にのみ、タスクはメインスレッドに入ります。実行のために。 理解できていなくても大丈夫です。後でイベントループについて説明するときに理解できるようになります。
JS 実行メカニズムよりあいまいな概念から始めましょう:
- 1. 同步任务由JavaScript 主线程按顺序执行。
- 2. 异步任务委托给宿主环境执行。
- 3. 异步任务完成后,对应的回调函数会被加入到任务队列中等待执行,任务队列又被分为宏任务队列和微任务队列,优先执行微任务队列,常见的微任务有new Promise().then,常见的宏任务有定时器
- 4. JavaScript 主线程的执行栈被清空后,会读取任务队列中的回调函数,次序执行。
- 5. JavaScript 主线程不断重复上面的第4 步,在执行回调函数时又会按照上面的四步去执行。
js一直从任务队列中取回调函数,然后放入主线程中执行,这是一个循环不断的过程,所以把它叫做事件循环。
这个还是要简单粗暴的来段代码会更直观一点:
const promise = new Promise((resolve, reject) => { console.log(1); setTimeout(() => { console.log("timerStart"); resolve("success"); console.log("timerEnd"); }, 0); console.log(2); }); promise.then((res) => { console.log(res); }); console.log(4);
现在我们根据上面的规则一步一步分析这段代码,如果不懂Promise也没有关系,我保证这并不影响你对事件循环的理解。现在你就把自己当成js代码的检察官,要正确把它们放在合适的“位置”
- 检察官的第一步就是判断哪些是同步代码,哪些是异步代码,OK,首先从上往下看,Promise本身是同步的,所以它应该在主线程上排队,然后继续看pomise.then是个异步任务,并且是属于微任务的,它的回调函数应该在微任务队列中(此时还不在),最后一句输出语句是同步代码,应该在主线程上排队。
- 第二步,执行主线程上的同步代码,首先有Promise排着队呢,所以先输出1,随后有个定时器,所以应该把它挂起执行,由于它没有时间延迟,所以回调函数直接被放入宏任务队列,继续执行代码,遇到打印,直接输出2。现在主线程还有其他的同步代码不?是不是还有一个输出语句,所以输出4,现在主线程上的同步代码执行完了
- 第三步读取任务队列,由于微任务队列上没有东西(Promise的状态并没有改变,不会执行promise.then()),所以读取宏任务队列上的回调函数,回调函数进入主线程执行,首先输出timerStart,然后promise状态发生改变,然后又遇到一个输出语句,输出timerEnd。现在主线程上又没有东西了,又得去看任务队列上有没有东西了。
- 第四步,由于promise状态发生改变了,所以微任务队列上有回调函数了,执行输出语句,res为success,输出success
【相关推荐:javascript视频教程、web前端】
以上がJavaScript イベントループの同期タスクと非同期タスクの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

Dreamweaver Mac版
ビジュアル Web 開発ツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール
