1

JavaScript 関数について質問があります。

例として、以下のコードを参照してください。

  • 最初の 2 行で、indexedDB を開きます。
  • その後、openRequest に onsuccess 関数を追加します。
  • アラートは正しく表示されます。

「open」関数が「success」イベント関数をトリガーすると想定しています。しかし、「open」関数が呼び出されたに「success」関数が openRequest にアタッチされるため、これはどのように機能するのでしょうか?

var indexedDB = window.indexedDB;
var openRequest = indexedDB.open('MyTestDB');
openRequest.onsuccess = function (response) {
    alert('sucess');
};
4

3 に答える 3

5

への呼び出しindexDB.openは非同期です。すぐに戻り、残りのコードは引き続き実行されます。データベースが実際に開かれると、イベントがトリガーされます。このイベントは、イベント キューに配置されます。JavaScript インタープリターは、定期的にイベント キューをチェックします。しかし、インタプリタもシングルスレッドです。チェックのために実行中の現在のコードから飛び出すことはありません。onsuccess 関数は、定義される前に呼び出されることはありません。実際、DB 自体も後で開かれることはありません。

たとえば、コードの最後に無限 while ループを配置すると、onsucess 関数は実行されません。

var indexedDB = window.indexedDB;
var openRequest = indexedDB.open('MyTestDB');
openRequest.onsuccess = function (response) {
    alert('sucess');
};

while (true) {};

その時点で実行がブロックされ、インタープリターはイベント キューをチェックせず、成功時の関数を実行しません。

http://javascript.info/tutorial/events-and-timing-depth

于 2013-11-02T11:33:44.197 に答える