JavaScript:获取传递函数的参数?

时间:2012-06-12 14:22:42

标签: javascript sqlite

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

预期的全球功能

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应该被废弃并以某种方式重写。关键是要获得一种可以很好地扩展的灵活方法。

3 个答案:

答案 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假设其单个参数是一个带有一个参数的函数。您需要创建一个带有一个参数的新函数,但还要包含您想要的特定参数值(即value1value2)。


以上使用匿名功能;您也可以使用命名函数来执行此操作:

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));