setTimeou スレッドメカニズムの簡単な分析
『ハイ パフォーマンス JavaScript』という本を読んでいるときに、次の文を目にしました:
このようにページの上部にスクリプトを配置すると、通常、ユーザーが操作できるようになるまでに、空白のページが表示されるなど、顕著な遅延が発生します。ページの読み取りや操作を開始することさえできます。
説明は次のとおりです:
スクリプトをヘッドに配置すると、通常は次のように大幅な遅延が発生します: ページを開いたときにページが空白になり、ユーザーは読むことができませんまたは何らかの方法で対話します。
私の理解は、js を head に配置すると、js の読み込みと実行によりページのレンダリングが遅れるということです。 jsを最後に配置すると、jsの読み込みや実行よりも先にページの描画が行われるため、jsのブロックの影響を受けずに最初にユーザーに提示することができます。
検証するために、次の実験が行われました:
<p>hello world</p><script type="text/javascript"> function f() { var t = +new Date(); //运行5秒 while(true) { if(+new Date() - t > 5) { break; } } } f(); // ①</script>
実験結果は興味深いものです: hello world は出てくるまでに 5 秒待機しました。
詳細な検証: 上記のスクリプト部分を js 外部リンクとして導入するか、動的にロードします。 5秒待っても結果は出ました。
これは、すべての js がロードされて実行された後にページのレンダリングが行われる必要があることを意味します。上の段落には誤りがあります。
これは、jsがDOM操作を含まない限り、先頭と末尾に配置しても同じ効果があるという意味ですか?もちろん違います。たとえば、html内に画像やその他のリソースがある場合、jsが先頭に配置されている場合、画像のダウンロードはjsの実行が完了するまで待ってから開始する必要があります。ただし、jsが末尾に配置されている場合、画像のダウンロードは js の実行をブロックしません。画像のダウンロードと js の実行を並行して実行できます。
これで問題は終わりですか?もちろんそうではありません。フロントエンドの作業の非常に重要な部分は、上記の JS を最適化する方法です。そこでsetTimeoutを考えました。
setTimeout は、js コードの実行を遅延させるために使用されます。これには、背後での js の実行がブロックされないという利点があります。したがって、setTimeout もページのレンダリングをブロックしないと思います。
オプション 1: 上記の①の部分を次のように置き換えます:
setTimeout(f,0);ログイン後にコピー
その結果、hello world は出力されるまでに 5 秒待つ必要があります。ただし、注意して見ると、ブラウザーのタグにロード記号が表示されていないことがわかります。
推測を続けます。0 は小さすぎるため、ブラウザーは setTimeout の背後に JS コードがないことを検出し、すぐに setTimeout の内容、つまり f 関数を実行します。そこで時間を 100ms に変更します。
オプション 2: 上記の①の部分を次のように置き換えます:
setTimeout(f, 100);ログイン後にコピー
その結果、Hello World が即座にポップアップ表示されます。ちょっと興奮。興味のある学生は、この時点で、クリティカル値があることがわかります (ブラウザごとにクリティカル値が異なります)。それ以外の場合は、hello world が即座にポップアップ表示されます。 、内部の機能が完了するとポップアップします。
すごいですね、なぜこんなことが起こるのでしょうか?この質問に答えるには、ブラウザのスレッド メカニズムを研究する必要があります。
ブラウザ内には少なくとも 2 つのスレッドがあることがわかっています。js を解析するスレッドとインターフェイスをレンダリングするスレッドです。ここでは、それらを仮に JS スレッドと UI スレッドと呼びます。
jsはDOMを操作できるため、これらの要素の属性を変更しながらインターフェースを描画すると(つまり、JSスレッドとUIスレッドが同時に実行されると)、描画スレッドの前後で取得した要素のデータが保持されてしまう可能性があります。一貫性がなくなる。したがって、予期しないレンダリング結果を防ぐために、ブラウザーは JS スレッドと UI スレッドがキュー内で同期的に実行されるように制御します。
上記の質問に戻りますが、setTimeout が実行されると、JS スレッドの実行の途中で新しいタイマー スレッドが開きます。JS スレッドが完了すると、すぐに setTimeout が実行を開始することがわかります。つまり、時間が上記の臨界値未満である場合)、UI スレッドの実行時間が長すぎることによって引き起こされる setTimeout の重大な遅延によって引き起こされる悪いエクスペリエンスを回避するために、ブラウザーは setTimeout の有効期限が切れるまで待機することを選択し、その後実行されます。中のjs。 setTimeout の有効期限が切れるまでに長い時間がかかることが判明した場合、時間の無駄を避けるために、ブラウザーはすぐに UI スレッドに切り替えることを選択します。
結論: setTimeout は、時間のかかる JS コードの処理に使用できますが、2 番目のパラメーターを小さすぎないように注意してください。小さすぎると、同じ空白のページが表示されます。すべてのブラウザで満足できる 100 ミリ秒程度が推奨されます。もちろん、IE と互換性がない場合は、setTimeout を放棄し、Web Workers を選択するのが良いでしょう。
HTML4 では、js によって作成されたプログラムはシングルスレッドであり、Web ワーカーは HTML5 の新機能であり、Web アプリケーションでバックグラウンド処理を実装するために使用されるテクノロジーです。この API を使用すると、バックグラウンドで実行されるスレッドを非常に簡単に作成できます:
var worker = new Worker('*.js');// 后台线程是不能访问页面或窗口对象的// 但可通过发送消息和接受消息与后台线程传递数据worker.onmessage = function (e) {}; worker.postMessage = function (e) {};
以上がsetTimeou スレッドメカニズムの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

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

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Ubuntu Linux で FirefoxSnap を削除するには、次の手順に従います。 ターミナルを開き、管理者として Ubuntu システムにログインします。次のコマンドを実行して FirefoxSnap をアンインストールします: sudosnapremovefirefox 管理者パスワードの入力を求められます。パスワードを入力し、Enter キーを押して確認します。コマンドの実行が完了するまで待ちます。完了すると、FirefoxSnap は完全に削除されます。これにより、Snap パッケージ マネージャー経由でインストールされた Firefox のバージョンが削除されることに注意してください。他の方法 (APT パッケージ マネージャーなど) を通じて別のバージョンの Firefox をインストールした場合は、影響を受けません。上記の手順を実行します

Mozilla Firefox はアンインストールできます。Firefox はサードパーティのブラウザなので、不要な場合はアンインストールできます。アンインストール方法: 1. [スタート] メニューで、[Windwos システム] - [コントロール パネル] をクリックします; 2. [コントロール パネル] インターフェイスで、[プログラムと機能] をクリックします; 3. 新しいインターフェイスで、[プログラムと機能] をクリックします。 Firefox ブラウザ アイコン; 4. アンインストール ポップアップ ウィンドウで、[次へ] をクリックします; 5. [アンインストール] をクリックします。

settimeout と setInterval の違い: 1. トリガー時間、settimeout は 1 回限りで、遅延時間を設定した後に関数を 1 回実行しますが、setinterval は反復的で、設定された時間間隔で関数を繰り返し実行します; 2. 実行時間、settimeoutは一度だけ実行され、setintervalはキャンセルされるまで繰り返し実行されます。

最近のニュースによると、Mozilla は Firefox 112 の安定版をリリースしましたが、次のメジャー バージョンである Firefox 113 がベータ チャネルに入り、AV1 アニメーション、強化されたパスワード ジェネレーター、およびピクチャ イン ピクチャ機能をサポートすることも発表しました。 Firefox 113の主な新機能・特徴は以下の通り:AV1形式のアニメーション画像(AVIS)のサポート、特殊文字の導入によるパスワード生成機能のセキュリティ強化、ピクチャーインピクチャー機能の強化、巻き戻しのサポート、ビデオ時間の表示モードでは、Debian および Ubuntu ディストリビューション用の公式 DEB インストール ファイルが提供されます。ブックマーク インポート機能が更新され、インポートされたブックマークのアイコンがデフォルトでサポートされます。サポートされているハードウェアでは、w を使用してハードウェア アクセラレーションによる AV1 ビデオ デコードがデフォルトで有効になります。

ログイン、検証コード、またはスキャンコードによるログインが必要な Web サイトをクロールするクローラーにとって、非常に厄介な問題です。 Scrapy は Python の非常に使いやすいクローラー フレームワークですが、認証コードを処理したり、QR コードをスキャンしてログインしたりする場合は、いくつかの特別な措置を講じる必要があります。 Mozilla Firefox は一般的なブラウザとして、この問題の解決に役立つソリューションを提供します。 Scrapy のコア モジュールは複雑で、非同期リクエストのみをサポートしますが、一部の Web サイトでは Cookie と

Apple は、iPhone、iPad、Mac、Apple Watch のアップデートをリリースしました。各デバイスのアップデートは小規模ですが、WebKit の脆弱性に対処します。同社はまた、MacBookラップトップのバッテリーを予期せず消耗させるバグを修正したことも保証した。 Apple iOS および iPadOS 15.3.1 はマイナー アップデートです。実際には、大きな機能は含まれていません。ただし、点字ディスプレイを使用している人にとっては便利です。さらに、このアップデートにより、任意のコードが実行される脆弱性も解決されます。 iOS 15.3.1 のアップデートノートには次のように記載されています: iOS 15.3.1 は iPhone に重要なセキュリティアップデートと修正を提供します

Canonical は最近、次期 Ubuntu 23.10 で Firefox Snap がデフォルトで Wayland モードで実行されるように構成されたことを発表しました。注: 現在、Ubuntu にはデフォルトで Wayland セッションがあり、Firefox も通常どおりに動作します。ただし、現在 FirefoxSnap は実際には、厳密なネイティブ Wayland モードではなく、XWayland 互換モードで実行されます。 Canonical は、HiDPI ディスプレイ上でインターフェイスのぼやけやスケーリングの歪みなどの問題が発生しないように、デフォルトで Firefox ブラウザを Wayland モードで実行し、ドラッグやピンチなどのタッチ ジェスチャをサポートすると発表しました。上でも述べたように、Ubunt

1 月 26 日のニュースによると、ヨーロッパの iPhone ユーザーが iOS17.4Beta1 アップデートにアップグレードすると、デフォルトのブラウザの変更をサポートする Safari ブラウザを開いた後に新しいウィンドウが表示されます。ヨーロッパのユーザーは、Firefox、Opera、Chrome、Brave、Microsoft Edge などの Safari 以外のブラウザを自分の好みに応じてセットアップできます。ブラウザ アプリでは、ブラウザ アプリやアプリ内ブラウジング エクスペリエンスなど、WebKit 以外のブラウザ エンジンも使用できるようになりました。 Apple は以前、Chrome や Firefox などの一般的なブラウザを含む iOS 上のすべてのブラウザが WebKit エンジンを使用することを義務付けていました。
