[英]JavaScript: Get parameters of passed function?
如标题所述,我想知道是否有可能获取传递函数的参数。 经过数小时的搜索并查看了类似的问题,我仍然走得很近,所以我将附上一个简单的示例,而不是我正在研究的内容-因为我开始怀疑这是不可能的。
预期的全局功能
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调用了正确的函数,但没有正确传递参数:保留了参数(值1,值2),但是事务对象丢失/未定义。 我知道为什么会发生这种情况,但是我看不到任何解决方案。 所有人都说过,我也开放应该废弃getTransaction并以某种方式对其进行重写。 关键是要获得一种可扩展的灵活方法。
只需重构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);
),而不是将它们放在数组中。
getTransaction(function (x) {
iDontWork(x, value1, value2);
});
您的getTransaction
假定其单个参数是一个采用一个参数的函数。 您需要创建一个新函数,该函数需要一个参数,但还要包含所需的特定参数值(即value1
和value2
)。
上面使用了匿名函数; 您也可以使用命名函数:
function forwarder(x) {
iDontWork(x, value1, value2);
}
getTransaction(forwarder);
您可以通过创建部分函数来做到这一点:
function iDontWork(param1, param2){
return function(tx) {
tx.doSomething(param1, param2);
}
}
和:
getTransaction(iDontWork(value1, value2));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.