javascript回调函数参数

javascript回调函数参数,javascript,cordova,parameters,callback,Javascript,Cordova,Parameters,Callback,我想使用javascript调用回调函数,正如您从中的示例代码所看到的 调用方法“queryDB”时不带任何参数,但函数定义为接收变量“tx”。来自PHP,我无法理解它是如何工作的,因为它确实如此。 还有querySuccess,它接收2个参数,也可以工作 我的问题是我需要发送1我自己的参数,因此我修改了对queryDB的调用,如下所示: var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000); db.tra

我想使用javascript调用回调函数,正如您从中的示例代码所看到的

调用方法“queryDB”时不带任何参数,但函数定义为接收变量“tx”。来自PHP,我无法理解它是如何工作的,因为它确实如此。 还有querySuccess,它接收2个参数,也可以工作

我的问题是我需要发送1我自己的参数,因此我修改了对queryDB的调用,如下所示:

var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
db.transaction(queryDB(myParam), errorCB);

但这是行不通的

1) 为什么会收到未发送的参数? 2) 如何添加自己的参数而不破坏它?

试试以下方法:

db.transaction(function() { queryDB(tx, myParam); }, errorCB);

function queryDB(tx, myParam) {
    //logic here
}
事务函数正在寻找不包含参数的回调方法。您可以通过指定一个匿名函数来“劫持”此函数,该函数使用参数调用所需的函数。

当您编写

db.transaction (queryDB, errorCB);
您正在将函数本身作为参数传递,但如果尝试以下操作:

db.transaction (queryDB(myParam), errorCB);
您将作为参数传递函数的结果,这将生成一个错误

db.transacción
receives参数是两个函数,如果需要传递自定义参数,只需将它们写入声明中即可

function queryDB(tx, myParam) {
    //Using your myParam
    tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB);
}
...
db.transaction(queryDB, errorCB);

记住javascript是一种解释性编程语言,不是面向对象的,所以我想我已经找到了答案。 从这里阅读 我意识到Dawson Loudon的响应几乎完成了,但他忽略了应传递给调用第二个函数的第一个函数的“tx”变量,即:

db.transaction(function(tx) { queryDB(tx, myParam); }, errorCB);

function queryDB(tx, myParam) {
    //logic here
}

感谢您的时间和帮助。

但是我认为“tx”是函数收到变量时收到的名称,但是我如何发送一个不存在也从未创建过的变量呢?谢谢这就是我在上面展示的内容。您必须首先传递tx参数,因为这是事务的工作方式,通过使用匿名函数作为回调,您可以通过调用传递其他参数(即
queryDB(tx,myParam)
。您必须传递
tx
,但使用上述方法,您也可以传递
myParam
或任何其他希望传递的参数。但“tx”并不像OP所说的那样创建。是的,
db.transaction
自动将
tx
传递给分配给它的回调函数参数。当您发送
myParam时
queryDB(myParam)
会出现什么错误?我不知道,因为我在设备模拟器上运行,还没有调试控制台。但是JpBaena13解释了为什么它不能按预期工作。JavaScript中的参数是建议,而不是命令。所有函数都可以接受任意数量的参数(从0到9999及以上)不管声明了什么参数。您可以将参数视为索引参数的别名:
函数foo(a,b,c){…}
基本上等同于
函数foo(){var a=arguments[0],b=arguments[1],c=arguments[2];…}
。myParam在函数queryBD的范围内不是没有定义吗?
function queryDB(tx, myParam) {
    //Using your myParam
    tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB);
}
...
db.transaction(queryDB, errorCB);
db.transaction(function(tx) { queryDB(tx, myParam); }, errorCB);

function queryDB(tx, myParam) {
    //logic here
}