JavaScript 事件函数 - 在声明之前调用
javascript event functions - called before being declared
我有一个关于JavaScript函数的问题。
作为示例,请参考下面的代码。
- 在前 2 行中,我打开了一个索引数据库。
- 之后,我将 onsuccess 函数附加到 openRequest。
- 警报正确显示。
我假设"打开"函数触发"成功"事件函数。但是,由于"成功"函数在调用"open"函数后附加到openRequest,这如何工作呢?
var indexedDB = window.indexedDB;
var openRequest = indexedDB.open('MyTestDB');
openRequest.onsuccess = function (response) {
alert('sucess');
};
对indexDB.open
的调用是异步的。它会立即返回,其余代码继续运行。当数据库实际打开时,将触发一个事件。此事件放置在事件队列中。JavaScript 解释器定期检查事件队列。但解释器也是单线程的。它不会跳出它正在执行的当前代码来检查它。在定义 onsuccess 函数之前,永远不会调用它。事实上,数据库本身也永远不会被打开,直到以后。
例如,如果在代码末尾放置一个无尽的 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
这是可能的,因为JavaScript VM(以V8为例)执行成功处理程序的分配速度比打开indexDB的速度快。这是由于对indexedDB.open()
的调用是异步的,因此 VM 在后台打开数据库并执行事件处理程序分配。
如果延迟事件处理程序的分配,您将看到它不再被调用:
→ 小提琴
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
另请阅读上面的艾切迪的回答!
indexedDB.open
在后台发出异步请求。准备就绪后,将调用onsuccess
事件侦听器。
更好的做法是在 indexedDB.open
之前设置事件处理程序。
相关文章:
- 调用函数中声明的变量
- 我应该如何声明我的自调用函数
- 如何调用Crossrider中声明的javascript函数;background.js”;点击我网站页面上的一个按钮
- JavaScript访问调用函数中声明的变量
- Dijkstra's”;针对GOTO声明的案件“;与函数一样适用于现代调用代码的命名封装
- 如何在 PopConconfirm 中单击按钮 yes 时调用在 Angular 控制器中声明的删除函数
- JavaScript 事件函数 - 在声明之前调用
- 如何使用在 jscript 中声明的参数调用 Html.RenderAction()
- 从 Angular 中声明的子窗口调用主窗口中的函数
- 每次调用函数时,是否都会重新创建函数中声明的字符串变量
- 在 AJAX 函数中声明变量并稍后调用它 (jQuery)
- 如何确保将正确的参数传递给循环中声明的函数调用
- 只有从html set onclick事件调用代码声明函数时,该函数才不存在
- Node sequelize回调承诺期望一个函数,是否有一种方法可以通过函数调用删除已声明的函数
- 声明的javascript函数调用自身
- 用自调用函数声明KnockoutJS模型有什么区别
- 为什么在运行时调用声明的函数
- Angular的ng-change for select不调用声明的方法
- 使用Applescript调用声明为VAR的AJAX函数
- 调用声明的函数x.f = function()从其他文件——js