繁体   English   中英

Javascript:以函数作为参数调用函数

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM