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

时间:2013-11-02 10:43:01

标签: javascript html5 indexeddb

我对JavaScript函数有疑问。

例如,请参阅以下代码。

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

我假设'open'函数触发'success'事件函数。但是这怎么可行,因为“成功”功能附加到openRequest 之后调用'open'函数?

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

3 个答案:

答案 0 :(得分: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) {};

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

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

答案 1 :(得分:2)

这是可能的,因为JavaScript VM(例如,以V8为例)比打开indexDB更快地执行成功处理程序的分配。这是因为对indexedDB.open()的调用是异步的,因此VM在后台中打开数据库,执行事件处理程序分配。

如果延迟事件处理程序的分配,您将看到它不再被调用:

→ jsFiddle

var indexedDB = window.indexedDB;
var openRequest = indexedDB.open('MyTestDB');

window.setTimeout(function () {
    openRequest.onsuccess = function (response) {
        alert('sucess');
    };
}, 1); // also test higher values - 1ms worked fine for me

另请阅读上面的aychedee's answer

答案 2 :(得分:0)

indexedDB.open在后​​台发出异步请求。准备好后,将调用onsuccess事件侦听器。

indexedDB.open之前设置事件处理程序是一种更好的做法。