2012-06-12 108 views
1

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

预期全局函数

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

决定废止这个解决方案,因为已经指出getTransaction()的设计很糟糕。 –

回答

1

简单重构getTransation采取功能和

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

getTransaction(forwarder); 
+1

或者,可以这样做,使得不需要参数数组,作为'getTransaction(anyMethod)''通过切片'参数' – goat

+0

感谢您的回复。但据我所知,这不会动态支持none,一个或多个参数/参数。这个想法是getTransaction应该可以用于需要事务对象的任何方法。 –

+0

(编辑:考虑更新/编辑的答案。) –

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

您的getTransaction假定其单参数是一个函数,它接受一个参数。您需要创建一个带有一个参数的新函数,但还需要包含所需的特定参数值(即value1value2)。


以上使用的是匿名函数;你也可以使用一个命名函数做到这一点:

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

而且:

getTransaction(iDontWork(value1, value2)); 
+0

感谢您的回复。据我所知,这意味着我必须为任何具有多个参数/参数的方法创建匹配的“forward”方法? –

+1

是;你已经将自己设计到了这个角落,因为你的getTransaction函数只能用于一个参数的函数,这是一个非常奇怪的属性。 – Domenic

0

您可以通过创建部分功能做一系列参数。预先设置transaction变量参数数组,并使用apply调用该函数:

doTransaction(iDontWork, [param1, param2]); 
doTransaction(iWork); 

编辑

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

    // ... 

    ); 
} 

与简单地使用它

由于@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);)中所做的那样,而不是将它们放入数组中。