JavaScript:获取传递函数的参数

JavaScript: Get parameters of passed function?

本文关键字:参数 传递函数 获取 JavaScript      更新时间:2023-09-26

正如标题所说,我想知道是否有可能获取传递函数的参数。经过几个小时的搜索和查看类似的问题,我仍然没有接近,所以我将附上一个简单的例子,而不是我正在做的事情 - 因为我开始怀疑这是不可能的。

预期的全局函数

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假定其单个参数是接受一个参数的函数。您需要创建一个新函数,该函数接受一个参数,但还包括所需的特定参数值(即 value1value2 )。


上面使用匿名函数;你也可以使用命名函数来做到这一点:

function forwarder(x) {
    iDontWork(x, value1, value2);
}
getTransaction(forwarder);

您可以通过创建分部函数来实现:

function iDontWork(param1, param2){
    return function(tx) {
        tx.doSomething(param1, param2);
    }
}

和:

getTransaction(iDontWork(value1, value2));