JavaScript:获取传递函数的参数
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));
- 函数未将值作为参数传递
- 如何在HTML元素上创建函数,而不是将元素作为参数传递
- 如何传递函数中的参数
- 将参数传递给函数
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 传递带有参数的函数
- javascript,将参数传递给函数内部的闭包中的回调
- 将字符串作为参数传递给函数onclick event jquery
- 将修改后的数组作为参数传递给函数
- 代码气味-将布尔控制参数传递给函数
- 将参数传递给函数,同时保留事件处理程序
- 如何使用按钮将参数传递给函数
- 作为参数传递时如何计算函数
- 将对象作为参数传递时的 Javascript 函数作用域
- 将回调作为参数传递给函数
- 在构造控制器、服务等时作为函数参数传递之前列出的角度 JS 变量
- 作为参数传递的函数的异步执行
- 将请求作为参数传递给函数
- 什么时候需要在javascript中的函数中将对象作为参数传递
- Javascript,对象,用参数传递函数作为参数- angular, jquery概念基本误区