[英]Javascript: calling functions with function as parameters
不确定标题是否很好地描述了我的问题,但是现在开始吧。 我有一个函数(f1)进行一些处理,并使用另一个函数f2作为参数。 实际上,f2被“注入”到f1中,因此f2的“签名”可以不同(例如,f2可以具有或不具有某些参数)。 我想知道拥有通用代码的最佳方法是什么?
在这里,我们附带了代码,当然可以更好地解释它。 遍历是我的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“签名”?
谢谢你的帮助!
如果我正确理解了您的问题,那么您希望方法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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.