有人可以在此页面的代码段中解释function(tx)
:http://www.webkit.org/demos/sticky-notes/。
tx
在哪里以及如何分配?我查看了here的信息,但仍然处于黑暗中。
我认为我理解的是,对象的 saveAsNew 方法被定义为一个匿名函数,它首先创建一个时间戳并创建一个对自身的本地引用(note = this),并且然后调用 db 对象的事务方法,为该方法提供一个参数,该参数是另一个具有参数 tx 的匿名函数。但我不明白 tx 的来源。
.
.
.
saveAsNew: function()
{
this.timestamp = new Date().getTime();
var note = this;
db.transaction(function (tx)
{
tx.executeSql("INSERT INTO WebKitStickyNotes (id, note, timestamp, left, top, zindex) VALUES (?, ?, ?, ?, ?, ?)", [note.id, note.text, note.timestamp, note.left, note.top, note.zIndex]);
});
},
.
.
.
答案 0 :(得分:1)
首先,tx
是参数定义。您可以选择任何名称,也可以是bar
。它与将函数定义为
function foo(bar) {
}
如果你想知道“谁”正在传递这个论点,那么它可能是db.transaction
。您将该函数作为callback [Wikipedia]传递。某处db.transaction
会调用:
callback(transaction);
也许这个例子有助于它理解:
function hello(callback) {
// do some very important world changing computations... then:
callback('Hello ');
}
hello(function(foobar) {
alert(foobar + 'Tim!');
});
// alerts 'Hello Tim!'
这里,hello
函数将一个参数传递给回调函数。
答案 1 :(得分:0)
如果我知道transaction()
是什么,我可以帮助你更多。
但我相信这是函数返回的东西。
如同点击一样,会返回<{p}}
所以在event
代码的某个地方,一个变量被发送到该函数,然后您可以在代码中命名和使用该函数。
从早期的代码:
transaction
您必须查看db = openDatabase("NoteTest", "1.0", "HTML5 Database API example", 200000);
具有openDatabase
功能的内容。
答案 2 :(得分:0)
函数saveAsNew返回一个以tx为参数的函数:
var new = saveAsNew();
new(tx);
关于tx的来源,不可能从这个片段中说出来。
答案 3 :(得分:0)
db.transaction()函数必须接受一个参数,该参数是一个带有一个参数的函数(在您的示例中为function(tx))。
它可能记录为db.transaction(回调)。
db.transaction()函数将参数tx发送到回调函数(在你的情况下为匿名函数(tx))。
答案 4 :(得分:0)
您可以使用任何变量,只要在您的匿名方法定义中使用相同的变量即可。在调用匿名方法时,事务方法将传递一个值作为第一个参数,并将其分配给tx。
答案 5 :(得分:0)
您的代码与此相同:
saveAsNew: function()
{
this.timestamp = new Date().getTime();
var note = this;
function booga(tx)
{
tx.executeSql("INSERT INTO WebKitStickyNotes (id, note, timestamp, left, top, zindex) VALUES (?, ?, ?, ?, ?, ?)", [note.id, note.text, note.timestamp, note.left, note.top, note.zIndex]);
}
db.transaction(booga);
},
“tx”来自“booga(tx)”在哪里?答:无论谁调用booga都会传递一个参数,而tx是我们给该参数的名称。
答案 6 :(得分:0)
函数调用db.transaction()
本身需要一个参数。该参数本身是db.transaction()
将调用的函数,当它调用该函数时,它将向其传递一个参数。名称tx
可以是任何名称,它只是此函数的第一个参数的名称。
您的代码可能是使用您传递给db.transaction()
的函数编写的,就像您在此处所做的匿名函数一样:
db.transaction(function (tx)
{
tx.executeSql("INSERT INTO WebKitStickyNotes (id, note, timestamp, left, top, zindex) VALUES (?, ?, ?, ?, ?, ?)", [note.id, note.text, note.timestamp, note.left, note.top, note.zIndex]);
});
或者它本来是用这种方式写的,它会更明显地发生什么,但不是那么紧凑:
function writeSql(tx) {
tx.executeSql("INSERT INTO WebKitStickyNotes (id, note, timestamp, left, top, zindex) VALUES (?, ?, ?, ?, ?, ?)", [note.id, note.text, note.timestamp, note.left, note.top, note.zIndex]);
}
db.transaction(writeSql);