目次
1. setTimeout
2. SetTimeout の良いパートナー "0"
3、setTimeout的一些秘密
ホームページ ウェブフロントエンド jsチュートリアル JavaScript 開発者が知っておくべき setTimeout の秘密

JavaScript 開発者が知っておくべき setTimeout の秘密

Feb 20, 2017 pm 02:22 PM

Timer

setTimeout
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

は、指定したミリ秒後に関数を呼び出したり、式を計算したりするためによく使用されます。

構文:

setTimeout(code, millisec, args);
ログイン後にコピー



注: コードが文字列の場合、コードを実行するために

eval()
ログイン後にコピー

メソッドを実行するのと同じです。

もちろん、この記事では

setTimeout
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

の使用方法を説明するだけでなく、それがどのように実行されるかも理解します。

1. setTimeout

の原理 まずコードの一部を見てみましょう:

var start = new Date(); 
var end = 0; 
setTimeout(function() {  console.log(new Date() - start); }, 500); 
while (new Date() - start <= 1000) {}
ログイン後にコピー

上記のコードでは、

setTimeout
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

タイマーが定義されており、遅延時間は 500 ミリ秒です。

印刷結果は500だと思いますか

しかし、事実はあなたの予想を超えており、印刷結果は次のようになります(印刷すると異なるかもしれませんが、間違いなく1000ミリ秒を超えるでしょう):

JavaScript 開発者が知っておくべき setTimeout の秘密

どうしてですか?その理由は、JavaScript が単一スレッドで実行されるためです。つまり、どの時点においても、JavaScript プログラムを実行するスレッドは 1 つだけであり、複数のコードを同時に実行することはできません。

ブラウザーでの JavaScript を見てみましょう。

ブラウザのカーネルはマルチスレッドであり、カーネルの制御下で相互に連携して、ブラウザには少なくとも 3 つの常駐スレッド (JavaScript エンジン スレッド、GUI レンダリング スレッド、ブラウザ イベント トリガー スレッド) が実装されています。

JavaScript引擎
ログイン後にコピー

は、イベント駆動型のシングルスレッド実行に基づいています。JavaScript エンジンは、タスク キュー内のタスクの到着を待ってから、それらを処理します。ブラウザーでは、常に 1 つの JavaScript スレッドのみが JavaScript プログラムを実行します。 。

GUI渲染线程
ログイン後にコピー

は、ブラウザインターフェースのレンダリングを担当します。インターフェースの再描画(Repaint)が必要な場合、または何らかの操作によってリフロー(Reflow)が発生した場合、このスレッドが実行されます。ただし、GUI レンダリング スレッドと JavaScript エンジンは相互に排他的であることに注意してください。JavaScript エンジンが実行されると、GUI スレッドは一時停止され、GUI の更新はキューに保存され、JavaScript が実行されるとすぐに実行されます。エンジンはアイドル状態です。

事件触发线程
ログイン後にコピー

、イベントがトリガーされると、スレッドはそのイベントを保留キューの最後に追加し、JavaScript エンジンによる処理を待ちます。これらのイベントは、setTimeout などの JavaScript エンジンによって現在実行されているコード ブロックから、またはマウス クリックや Ajax 非同期リクエストなどのブラウザ カーネル内の他のスレッドから発生する可能性があります。ただし、JavaScript のシングルスレッド関係により、すべてのイベントが発生します。これらのイベントはキューに入れて、JavaScript エンジンによる処理を待つ必要があります (スレッド内で同期コードが実行されていない場合にのみ、非同期コードが実行されます)。

ここで、元の例を確認してみましょう:

var start = new Date();
 var end = 0;
 setTimeout(function() {  console.log(new Date() - start); }, 500);
 while (new Date() - start <= 1000) {}
ログイン後にコピー


setTimeout
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

の遅延時間は500ミリ秒ですが、

while
ログイン後にコピー

ループの存在により、間隔が1000ミリ秒を超える場合にのみ、 while ループから抜け出します。つまり、1000 ミリ秒より前に、while ループが JavaScript スレッドを占有していました。つまり、while から抜け出すのを待った後にのみ、スレッドはアイドル状態になり、以前に定義された setTimeout を実行します。

最後に、

setTimeout
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

はタスク(実行する必要のある関数)が指定された時間後にタスクキューに挿入されて待機することを保証するだけであり、タスクがいつ実行されるかは保証しないと結論付けることができます。 。 JavaScript を実行しているスレッドが空になったら、タスクをキューから削除して実行します。

JavaScript スレッドは時間のかかる操作によってブロックされないため、キュー内のタスクをすぐに取り出して実行できます。また、このキュー メカニズムが非同期実行の錯覚を生み出します。

2. SetTimeout の良いパートナー "0"

おそらく次のコードを見たことがあるでしょう:

setTimeout(function(){ // statement}, 0);
ログイン後にコピー


上記のコードは即時実行を意味します。本来の目的は、呼び出した関数をすぐに実行することですが、実際には、setTimeout には最小実行時間が設定されており、指定された時間がその時間より短い場合、ブラウザーは許容される最小実行時間を使用するためです。つまり、setTimeout の遅延時間を 0 に設定しても、呼び出されたプログラムはすぐには開始されません。

ブラウザごとに実際の状況は異なります。IE8以前の時間精度は15.6msです。ただし、HTML5 の登場により、ブラウザの高度なバージョン (Chrome、IE9+ など) では、定義された最小時間間隔は 4 ミリ秒以上となり、この値よりも低い場合は自動的に増加します。2010 年には。その後、公開されたブラウザ全体で一貫して採用されました。

そのため、

setTimeout(fn,0)
ログイン後にコピー
ログイン後にコピー

として記述すると、実際にはキュージャンプ操作を実装し、ブラウザに「できるだけ早く」コールバックを実行するよう要求しますが、実際にどれくらい速くできるかはブラウザに完全に依存します。 。

では、

setTimeout(fn, 0)
ログイン後にコピー

は何の役に立つのでしょうか?実際、タスクの実行順序を変更できるという利点があります。ブラウザは現在のタスク キュー内のタスクを完了した後、setTimeout キューに蓄積されたタスクを実行するためです。

遅延後に実行するタスクを0sに設定することで、タスクの実行順序を変更したり、タスクの発生を遅らせたり、非同期で実行させることができます。

インターネットでよくある例を見てみましょう:

document.querySelector(&#39;#one input&#39;).onkeydown = function() {  
     document.querySelector(&#39;#one span&#39;).innerHTML = this.value;
 }; 
document.querySelector(&#39;#second input&#39;).onkeydown = function() {    
     setTimeout(function() {  
         document.querySelector(&#39;#second span&#39;).innerHTML = document.querySelector(&#39;#second input&#39;).value; }, 0);
};
ログイン後にコピー

`实例:实例

当你往两个表单输入内容时,你会发现未使用setTimeout函数的只会获取到输入前的内容,而使用setTimeout函数的则会获取到输入的内容。

这是为什么呢?

因为当按下按键的时候,JavaScript 引擎需要执行 keydown 的事件处理程序,然后更新文本框的 value 值,这两个任务也需要按顺序来,事件处理程序执行时,更新 value值(是在keypress后)的任务则进入队列等待,所以我们在 keydown 的事件处理程序里是无法得到更新后的value的,而利用 setTimeout(fn, 0),我们把取 value 的操作放入队列,放在更新 value 值以后,这样便可获取出文本框的值。

未使用setTimeout函数,执行顺序是:`onkeydown => onkeypress => onkeyup

使用setTimeout函数,执行顺序是:
ログイン後にコピー

onkeydown => onkeypress => function => onkeyup`

虽然我们可以使用

keyup
ログイン後にコピー
ログイン後にコピー

来替代

keydown
ログイン後にコピー

,不过有一些问题,那就是长按时,

keyup
ログイン後にコピー
ログイン後にコピー

并不会触发。

长按时,keydown、keypress、keyup的调用顺序:

keydown
keypress
keydown
keypress
...
keyup
ログイン後にコピー

也就是说keyup只会触发一次,所以你无法用keyup来实时获取值。

我们还可以用

setImmediate()
ログイン後にコピー

来替代

setTimeout(fn,0)
ログイン後にコピー
ログイン後にコピー



if (!window.setImmediate) {  
    window.setImmediate = function(func, args){  
      return window.setTimeout(func, 0, args);  
   };  
  window.clearImmediate = window.clearTimeout;
 }
ログイン後にコピー

setImmediate()`方法用来把一些需要长时间运行的操作放在一个回调函数里,在浏览器完成后面的其他语句后,就立刻执行这个回调函数,必选的第一个参数func,表示将要执行的回调函数,它并不需要时间参数。

注意:目前只有IE10支持此方法,当然,在Nodejs中也可以调用此方法。

3、setTimeout的一些秘密

3.1 setTimeout中回调函数的this

由于setTimeout() 方法是浏览器 window 对象提供的,因此第一个参数函数中的this其实是指向window对象,这跟变量的作用域有关。

看个例子:

var a = 1; 
var obj = {  
a: 2, 
 test: function() {  setTimeout(function(){  console.log(this.a);  }, 0);  
} 
}; 
obj.test(); // 1
ログイン後にコピー

不过我们可以通过使用bind()方法来改变setTimeout回调函数里的this

var a = 1; 
var obj = { 
 a: 2, 
 test: function() {  
setTimeout(function(){  
console.log(this.a);  
}.bind(this), 0);  
}
 }; 
obj.test(); // 2
ログイン後にコピー

3.2 setTimeout不止两个参数

我们都知道,setTimeout的第一个参数是要执行的回调函数,第二个参数是延迟时间(如果省略,会由浏览器自动设置。在IE,FireFox中,第一次配可能给个很大的数字,100ms上下,往后会缩小到最小时间间隔,Safari,chrome,opera则多为10ms上下。)

其实,setTimeout可以传入第三个参数、第四个参数….,它们表示神马呢?其实是用来表示第一个参数(回调函数)传入的参数。

setTimeout(function(a, b){  
console.log(a); // 3 
console.log(b); // 4},0, 3, 4);
ログイン後にコピー


 以上就是JavaScript 开发者应该知道的 setTimeout 秘密 的内容,更多相关内容请关注PHP中文网(www.php.cn)!

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

Tmall Elf Cloud アクセス サービスのアップグレード: 開発者料金が無料 Tmall Elf Cloud アクセス サービスのアップグレード: 開発者料金が無料 Jan 09, 2024 pm 10:06 PM

1月9日の当サイトのニュースによると、天猫エルフは最近、ゆんゆんアクセスサービスのアップグレードを発表し、アップグレードされたゆんゆんアクセスサービスは1月1日から無料モードから有料モードに変更される。このサイトには新機能と最適化が含まれています: クラウド プロトコルを最適化してデバイス接続の安定性を向上、主要カテゴリの音声制御を最適化、アカウント認証のアップグレード: Tmall Genie に開発者のサードパーティ アプリの表示機能を追加して、ユーザーがより速く更新できるようにしますアカウントのバインドに便利であり、同時に、開発者向けのサードパーティのアプリアカウント認証が追加され、Tmall Elf アカウントのワンクリックバインドをサポートし、端末画面の表示インタラクション機能が追加されました。音声インタラクションに加えて、 、ユーザーはアプリと画面のスピーカーを通じてデバイスを制御し、情報を取得できます。機器のステータス、新しいインテリジェントなシーン連携機能、新しい製品の属性とイベント、Tmall を定義するステータスまたはイベントとして報告できます。

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

See all articles