0

dbr が宣言された後にdbr.onsuccessを書くのは奇妙に思えます。

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

Q: 2 行目を (Rube Goldberg にならずに) 書く別の方法はありますか? たぶん次のようなもの:

function dbr.onsuccess(myEvent) {
}

ただ順番が気になります。私には、onsuccess 関数を作成した後でdbr に割り当てるのは遅すぎるようです。

4

3 に答える 3

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

非同期リクエストです。

非同期リクエストはバックグラウンドで実行され、関数が完了するまでコールバックを実行しません。したがって、コールバック関数が実行される前に、他のすべての割り当てが行われます。

indexedDB は、これらのコールバック関数が何であるかを正確に定義できるように、インターフェイス オブジェクトを返します。お願いをしているような感覚で考えてください。

マトリックスを開きたい

と言って応答を返します

ねえ、私はそれに取り組んでいます、ここにオブジェクトがあります。私がそれを終えたら、あなたがしたいことを挙げてください.

次に、開く操作が完了すると (そして現在の関数コンテキストの実行が完了すると)、そのオブジェクトを調べて、それに応じて実行されます。

の戻り値はopen、関数の実際の結果ではなく、何をすべきかを伝えるために返される単なるオブジェクトです。これは、通常の JS コールバック モデルとは異なる、promise/deferredの方法に似ています。

これ:

function dbr.onsuccess(myEvent) {
}

は有効な構文ではありません。オブジェクト自体が定義されるまで、オブジェクトのプロパティを定義することはできず、javascript はプロパティの関数宣言をサポートしていません。それらはトップレベルのオブジェクトにのみ使用されます。

于 2013-04-07T01:46:29.630 に答える
0

私はあなたが言うことができると思います:

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

これは、 のonsuccessプロパティへの割り当てステートメントであるため、技術的には関数式ですdbr

したがって、関数宣言を記述する方法が複数あるかどうかを尋ねると、答えは厳密にはノーです。

関数宣言には、次の 1 つの形式しかありません。

function foo() {}

関数をオブジェクトのプロパティとして宣言するための提案された構文は興味深いものですが、アイデアのしわは関数ホイストです。おそらく既にご存じのとおり、関数 (その定義を含む) はスコープ内のどこでも、先行するコードでも使用できます。次の例を見てください。

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

関数の巻き上げのため、foo.bar1 行目で使用できるはずです。ただし、変数の巻き上げのため、foo宣言されていますが、まだ定義されていません。行 1fooには値がundefinedあり、 function を呼び出そうとすると TypeError になりますfoo.bar

于 2013-04-07T01:46:37.007 に答える