2016-12-01 93 views
0

不確定標題是否很好地描述了我的問題,但在這裏我們繼續。 我有一個函數(f1)做了一些處理,並使用另一個函數f2作爲參數。實際上,f2在f1中被「注入」,因此f2的「簽名」可以不同(例如f2可能有或沒有某個參數)。我想知道什麼是儘可能通用的代碼的最佳方式?Javascript:以函數作爲參數調用函數

在這裏,我們走的代碼,這將更好地解釋它。 遍歷是我的f1函數,並掃描對象中的所有鍵。對於每個鍵,它都會執行某些操作 - 該活動由「注入」的f2執行。在下面的示例代碼中,我的函數f2用另一個鍵名替換了一個鍵名(這裏的「lastname」用「theLastname」)。目前編寫的方式不是非常通用的,因爲我必須編寫f1中的關鍵字。另外,說我有一個簡單的f2函數,只需要鍵名記錄它沒有參數?

// f2 function 
function replaceKey(object,keyname,newKeyname) { 
    if (object.hasOwnProperty(keyname)){ 
     object[newKeyname] = object[keyname]; 
     delete data[keyname]; 
    } 
    return object; 
}; 

// f1 function 
function traverse(o,doF) { 
    for (var i in o) { 
    doF('key : ' + i + ', value: ' + o[i]); 

    if (o[i] !== null && typeof(o[i])==="object") { 
     //going on step down in the object tree!! 
     traverse(o[i],doF); 
    } else { 
     doF(o,"lastname","theLastname"); // this is dependant on f2 signature - would like to make it more generic 
    } 
    } 
    return o; 
}; 


traverse(userList,replaceKey); 

我想吃點什麼是一樣的東西:

// f1 function 
function traverse(o,doF) { 
    for (var i in o) { 
    doF('key : ' + i + ', value: ' + o[i]); 

    if (o[i] !== null && typeof(o[i])==="object") { 
     //going on step down in the object tree!! 
     traverse(o[i],doF); 
    } else { 
     doF(o); 
    } 
    } 
    return o; 
}; 

所以,我可以有:

traverse(userList,replaceKey); 
traverse(userList,log); 

不知道如何寫它做的F1獨立的f2「簽名」?

感謝您的幫助!

+0

不知道您要做什麼。什麼是'doF'(即'replaceKey')應該只用一個參數? – Blorgbeard

+0

'delete data [keyname];' - 應該是'delete object [keyname];' –

回答

0

如果我正確理解你的問題,你希望你的方法f1不依賴於你傳遞給它的任何類型的f2。實現它的一種方法是使用方法工廠。

function createReplacer(keyname, newKeyname){ 
    return function(object) { 
     if (object.hasOwnProperty(keyname)){ 
      object[newKeyname] = object[keyname]; 
      delete data[keyname]; 
     } 
     return object; 
    }; 
}; 

現在,您可以創建關鍵替代品的特定版本:

var replaceKey = createReplacer("lastname","theLastname"); 

現在你可以有你的F2封裝的非通用參數範圍的內部。因此,f1可以按照您的意願完成....我認爲...只需通過replaceKey即可DoF

+0

非常感謝弗拉基米爾 - 這非常整潔,正是我所期待的。 – Christian68