正如标题所说,我想知道是否有可能获得传递函数的参数。经过几个小时的搜索和查看类似的问题,我仍然没有接近,所以我会附上一个简单的例子而不是我正在做的事情 - 因为我开始怀疑它是不可能的。
预期的全球功能
function getTransaction(anyMethod)
{
db.transaction
(
function(transaction)
{
anyMethod(transaction);
},
function errorCB(err) {
redirectToLoginWithError("Error processing SQL");
},
function successCB() {
;//alert("Success!");
}
);
}
要调用的函数
function iWork(tx)
{
tx.doSomething();
}
function iDontWork(tx, param1, param2)
{
tx.doSomething(param1, param2);
}
实际通话
// Works fine
getTransaction(iWork);
// The problem
getTransaction(iDontWork, value1, value2);
getTransaction(iDontWork2, value1, value2, ..., valueX);
我尝试了几种不同的方法,但到目前为止还没有一种方法成功。最接近(虽然不是很)已经
getTransaction(function(){iDontWork(value1,value2)}));
这会通过getTransaction调用正确的函数,但不会正确传递参数:保留Params(value1,value2),但事务对象丢失/未定义。我可以看到为什么会这样,但我看不到任何解决方案。所有人都说,我也很开放,因为getTransaction应该被废弃并以某种方式重写。关键是要获得一种可以很好地扩展的灵活方法。
答案 0 :(得分:1)
简单地重构getTransation
以获取函数和参数数组。将transaction
变量添加到参数数组中,并使用apply
调用该函数:
function getTransaction(anyMethod, methodArgs) {
var someFunction = anyMethod;
// if no args provided, use an empty array
methodArgs = methodArgs || [];
db.transaction (
function(transaction) {
// transaction is always the first arg; prepend it to the arg list
methodArgs.unshift(transaction);
// call method with argument array
anyMethod.apply(null, methodArgs);
},
// ...
);
}
只需使用它:
doTransaction(iDontWork, [param1, param2]);
doTransaction(iWork);
修改强>:
正如@rambo编码器指出的那样,你可以通过切片arguments
来使用常规参数(而不是参数数组):
function getTransaction(anyMethod) {
var someFunction = anyMethod;
db.transaction (
function(transaction) {
var methodArgs = arguments.slice(1);
methodArgs.unshift(transaction);
anyMethod.apply(null, methodArgs);
},
...
通过这种方式,您可以直接向getTransaction
提供参数,就像您在示例中所做的那样(doTransaction(iDontWork, param1, param2);
),而不是将它们放在数组中。
答案 1 :(得分:0)
getTransaction(function (x) {
iDontWork(x, value1, value2);
});
您的getTransaction
假设其单个参数是一个带有一个参数的函数。您需要创建一个带有一个参数的新函数,但还要包含您想要的特定参数值(即value1
和value2
)。
以上使用匿名功能;您也可以使用命名函数来执行此操作:
function forwarder(x) {
iDontWork(x, value1, value2);
}
getTransaction(forwarder);
答案 2 :(得分:0)
您可以通过创建部分功能来实现:
function iDontWork(param1, param2){
return function(tx) {
tx.doSomething(param1, param2);
}
}
和
getTransaction(iDontWork(value1, value2));