4

有人可以function(tx)在下面的代码片段中解释一下,来自这个页面:http ://www.webkit.org/demos/sticky-notes/ 。在哪里以及如何tx分配?我已经在这里寻找信息,但仍然一无所知。

我想我理解的是,对象的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]);
                 }); 
    },
    .
    .
    .

完整的代码粘贴

4

7 回答 7

1

首先tx是参数定义。您可以选择任何名称,也可以是bar. 它与将函数定义为

function foo(bar) {

}

如果你想知道“谁”在传递这个论点,那么它可能是db.transaction. 您将函数作为回调 [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函数将一个参数传递给回调函数。

于 2011-08-25T13:36:08.070 回答
0

如果我知道是什么transaction(),我可能会为您提供更多帮助。

但我相信这是函数返回的东西。

像点击有一个event返回

所以在transaction代码的某个地方,一个变量被发送到函数,然后你可以命名并在你的代码中使用。


从前面的代码:

db = openDatabase("NoteTest", "1.0", "HTML5 Database API example", 200000);

你必须看看openDatabase它有什么transaction功能。

你可以在openDatabase()这里阅读

于 2011-08-25T13:33:22.063 回答
0

函数 saveAsNew 返回一个以 tx 作为参数的函数:

var new = saveAsNew();
new(tx);

至于 tx 来自哪里,无法从这个片段中说出来。

于 2011-08-25T13:33:52.620 回答
0

db.transaction() 函数必须接受一个参数,该参数是一个接受一个参数的函数(在您的示例中为 function(tx) )。

它可能记录为 db.transaction(callback)。

参数 tx 由 db.transaction() 函数发送到回调函数(在您的情况下为匿名函数(tx))。

于 2011-08-25T13:34:55.227 回答
0

您可以使用任何变量,只要在匿名方法定义中使用相同的变量。事务方法将在调用匿名方法时将一个值作为第一个参数传递,并将其分配给 tx.

于 2011-08-25T13:35:22.593 回答
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);
},

“booga(tx)”中的“tx”来自哪里?答:谁调用booga都会传一个参数,tx就是我们给那个参数起的名字。

于 2011-08-25T13:40:10.920 回答
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);
于 2011-08-25T13:43:26.643 回答