JavaScript参数和匿名函数

4
请问下面代码片段中的function(tx)如何解释?此代码段来自http://www.webkit.org/demos/sticky-notes/页面。 tx在哪里赋值?我在这里查找了信息,但仍然不明白。
我理解的是,该对象的saveAsNew方法被定义为一个匿名函数,首先创建时间戳并创建对自身的本地引用(note = this),然后调用db对象的transaction方法,并向该方法提供另一个参数,即带有参数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个回答

1

首先,tx 是一个参数定义。你可以选择任何名称,也可以是 bar。这与定义函数没有区别。

function foo(bar) {

}

如果你想知道是谁传递了这个参数,那么很可能是 db.transaction。你将函数作为回调函数 [维基百科]进行传递。在某个地方,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函数向回调函数传递一个参数。

谢谢。我需要一个新的意符:启迪+困惑。 - Tim
@Tim:如果你还有疑问,请告诉我 ;) - Felix Kling
我觉得迷雾渐渐消散了。程序正在调用函数A,并告诉A去调用函数B,这个B作为参数传递给了A。如果B本身需要一个参数,那么程序会"相信" A 会提供它。 - Tim
@Tim:就像这样。你也可以说A需要B接受一个参数。但这取决于A正在做什么,因此它是情境相关的。总体而言,你是正确的。编辑:此评论的原始文本。 - Felix Kling
@Tim:我的意思是,有时候 B 必须返回一个值才能让 A 正常工作... 如果我让你更困惑了,抱歉... - Felix Kling

0
函数saveAsNew返回一个以tx为参数的函数:
var new = saveAsNew();
new(tx);

关于tx的来源,从这个片段中无法确定。

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”就是我们给该参数取的名称。

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

0
如果我知道 transaction() 是什么,我可能能更好地帮助你。
但我相信它是某个函数返回的东西。
就像 click 有一个返回的 event 一样。
因此在 transaction 代码中,会将一个变量发送到该函数中,然后您可以命名并在您的代码中使用。

从代码早期开始:

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

你需要了解一下 openDatabase 函数与 transaction 函数的作用。

你可以在这里详细了解 openDatabase()


0

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

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

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接