还有另一种写函数声明的方法吗?

时间:2013-04-07 01:40:20

标签: javascript

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

var dbr = window.indexedDB.open("Matrix");
dbr.onsuccess = function(myEvent) {}
问:有没有其他方法可以写第2行(不是Rube Goldberg)?也许是这样的:

function dbr.onsuccess(myEvent) {
}

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

3 个答案:

答案 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) {}