[英]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.