0

在声明 dbr之后写 dbr.onsuccess 对我来说似乎很奇怪。

var dbr = window.indexedDB.open("Matrix");
dbr.onsuccess = function(myEvent) {}

问:是否有另一种方式来编写第 2 行(不是 Rube Goldberg)?也许是这样的:

function dbr.onsuccess(myEvent) {
}

我只是关心事情的顺序。对我来说,在创建 dbr后为其分配 onsuccess 函数似乎为时已晚。

4

3 回答 3

1
var dbr = window.indexedDB.open("Matrix");

是一个异步请求。

异步请求在后台运行,并且在函数完成之前不会运行它们的回调。因此,所有其他分配都将在任何回调函数运行之前发生。

indexedDB 正在返回一个接口对象,以便您可以准确定义这些回调函数是什么。你可以把它想象成你提出请求

嘿我要开矩阵

并得到回复说

嘿,我正在处理这个,这是一个对象。当我完成它时,请列出你想要发生的事情。

然后,当它完成打开操作(并且当前函数上下文已完成运行)时,它将查看该对象并相应地运行。

的返回值open不是函数的真实结果,它只是一个返回的对象,告诉你该做什么。这类似于promise/deferred的做事方式,不同于普通的JS回调模型。

这:

function dbr.onsuccess(myEvent) {
}

不是有效的语法。在对象本身被定义之前,您不能在对象上定义属性,并且 javascript 不支持属性的函数声明。它们仅用于顶级对象。

于 2013-04-07T01:46:29.630 回答
0
dbr.onsuccess = function(myEvent) {}

这在技术上是一个函数表达式,因为它是onsuccessdbr.

因此,当您问是否有不止一种方法来编写函数声明时,从技术上讲,答案是否定的。

函数声明只有一种形式:

function foo() {}

您建议的将函数声明为对象属性的语法很有趣,但这个想法的一个问题是函数提升。您可能已经知道,函数(包括它们的定义)在范围内的任何地方都可用,甚至是前面的代码。举个例子:

foo.bar();
var foo = getFoo();
function foo.bar() {}

由于函数提升,foo.bar应该在第 1 行可用。但由于变量提升,foo声明但尚未定义。第 1 行foo的值为undefined并且如果您尝试调用 function 将导致 TypeError foo.bar

于 2013-04-07T01:46:37.007 回答
0

我想你可以说:

var dbr = window.indexedDB.open("Matrix").onsuccess = function(myEvent) {}
于 2013-04-07T18:54:47.233 回答