javascript参数匿名函数

时间:2011-08-25 13:29:24

标签: javascript arguments anonymous-function opendatabase

有人可以在此页面的代码段中解释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]);
                 }); 
    },
    .
    .
    .

FULL CODE PASTE

7 个答案:

答案 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功能的内容。

You can read up on openDatabase() here

答案 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);