对深层嵌套的高阶函数应用递归

ago*_*mez 4 javascript algorithm functional-programming

我正在解决Kolodny的Javascript练习(这里),特别是'价值'练习.

这个问题需要我创建一个函数,fn在那里fn(value)会返回一个答案.如果value是标量(即4),它将返回4.

如果value是函数,它将返回该函数的返回值.如果value是嵌套函数,它将返回深层嵌套函数的值.例如:

var fn = function() {
  return function() {
    return 4;
   };
};
assert.equal(value(fn), 4);
Run Code Online (Sandbox Code Playgroud)

我使用以下方法天真地解决了这个问题:

exports.value = (val) => {
  if (typeof val == 'function') {
    if (typeof val() == 'function') {
      if (typeof val()() =='function') {
        if (typeof val()()() =='function') {
          return false
        } else {
          return val()()();
        }
      } else {
        return val()();
      }
    } else {
      return val();
    }
  } else {
    return val;
  }
}
Run Code Online (Sandbox Code Playgroud)

此代码要求可重用性.有没有办法使用递归来调用n个深层嵌套的匿名函数?

Jon*_*lms 5

const value = v => typeof v === "function" ? value(v()) : v;
Run Code Online (Sandbox Code Playgroud)

只需value再次调用函数的结果即可.

更具可读性:

function value(v) {
  if (typeof v === "function") {
    return value(v()); // !!!
  } else {
    return v;
  }
}
Run Code Online (Sandbox Code Playgroud)