2016-12-01 99 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