javascript事件函数 - 在声明之前调用

Jos*_*ana 1 javascript html5 indexeddb

我有一个关于JavaScript函数的问题.

例如,请参考以下代码.

  • 在前两行中,我打开一个indexedDB.
  • 之后,我将onsuccess函数附加到openRequest.
  • 警报正确显示.

我假设'open'函数触发'success'事件函数.但是这怎么可行呢,因为'open'函数在调用'open'函数后被附加到openRequest ?

var indexedDB = window.indexedDB;
var openRequest = indexedDB.open('MyTestDB');
openRequest.onsuccess = function (response) {
    alert('sucess');
};
Run Code Online (Sandbox Code Playgroud)

ayc*_*dee 5

调用indexDB.open是异步的.它立即返回,其余代码继续运行.实际打开db时会触发事件.此事件放在事件队列中.JavaScript解释器定期检查事件队列.但是解释器也是单线程的.它不会跳出正在执行的当前代码来检查它.onsuccess函数在定义之前永远不会被调用.事实上,DB本身永远不会被打开.

例如,如果在代码末尾添加无限循环,则永远不会运行onsucess函数.

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

while (true) {};
Run Code Online (Sandbox Code Playgroud)

此时执行将被阻止,解释器永远不会检查事件队列,也不会运行on success success函数.

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