簡體   English   中英

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

     ...

這樣,您就可以像在示例中一樣將參數直接提供給getTransactiondoTransaction(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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM