在声明 dbr之后写dbr.onsuccess 对我来说似乎很奇怪。
var dbr = window.indexedDB.open("Matrix");
dbr.onsuccess = function(myEvent) {}
问:有没有其他方法可以写第2行(不是Rube Goldberg)?也许是这样的:
function dbr.onsuccess(myEvent) {
}
我只关心事情的顺序。对我来说,似乎在创建之后将onsuccess函数分配给dbr 为时已晚。
答案 0 :(得分:1)
var dbr = window.indexedDB.open("Matrix");
是异步请求。
异步请求在后台运行,并且在函数完成之前不会运行其回调。因此,所有其他分配都将在任何回调函数运行之前发生。
indexedDB返回一个接口对象,以便您可以准确定义这些回调函数。您可以在提出请求时将其视为
嘿我想打开矩阵
并回复说
嘿,我正在努力,这是一个对象。请列出我完成后你想要发生的事情。
然后,当它完成打开操作(并且当前函数上下文已经完成运行)时,它将查看该对象并相应地运行。
open
的返回值不是该函数的真实结果,它只是一个返回给您的对象,告诉它该做什么。这类似于promise/deferred处理方式,这与普通的JS回调模型不同。
此:
function dbr.onsuccess(myEvent) {
}
是无效的语法。在定义对象本身之前,您无法在对象上定义属性,并且javascript不支持属性的函数声明。它们仅用于顶级对象。
答案 1 :(得分:0)
dbr.onsuccess = function(myEvent) {}
这在技术上是一个函数表达式,因为它是onsuccess
的{{1}}属性的赋值语句。
因此,当您询问是否有多种方法来编写函数声明时,答案在技术上是否定的。
函数声明只有一种形式:
dbr
将声明函数作为对象属性的建议语法很有意思,但这个想法中的一个问题就是函数提升。您可能已经知道,函数(包括它们的定义)可在范围内的任何位置使用,甚至可以在代码之前。举个例子:
function foo() {}
由于功能提升,{1}在第1行应该可用。但由于可变提升,foo.bar();
var foo = getFoo();
function foo.bar() {}
已声明但尚未已定义。第1行foo.bar
的值为foo
,如果您尝试调用函数foo
,则会导致TypeError。
答案 2 :(得分:0)
我想你可以说:
var dbr = window.indexedDB.open("Matrix").onsuccess = function(myEvent) {}