如何在Javascript中实现这种链接?

时间:2019-06-18 08:31:14

标签: javascript function

f()()('x') // foox

f()()()()('x') //foooox

我试图返回嵌套函数,但无法获得所需的结果。

3 个答案:

答案 0 :(得分:4)

您可以创建一个函数,该函数将根据传递的参数返回函数或结果,前提是仅最后一次调用传递了参数。

function f() {
  let os = ''

  return function again(x) {
    os += 'o'
    if (!x) return again;
    else return `f${os}${x}`;
  }
}


console.log(f()()('x'))
console.log(f()()()()('x'))
console.log(f()()()()()()('Y'))

答案 1 :(得分:3)

仅使用计数器变量,如果未定义变量,则返回一个函数。

const f = (a, c = 0) => a ? "f" + "o".repeat(c) + a : b => f(b, ++c);
console.log(f()()("x"));
console.log(f()()()()("z"));

ES5语法:

function f(a, c) {
  c = c || 0;
  if (a) {
    return "f" + "o".repeat(c) + a;
  } else {
    return function(b) {
      return f(b, c + 1);
    }
  }
}
console.log(f()()("x"));
console.log(f()()()()("z"));

答案 2 :(得分:1)

您可以为一个函数多次调用返回一个函数,并实现一个toString方法以获取最终的字符串。

function f(v = 'o') {
    var s = 'f' + v;
    function g(v = 'o') {
        s += v;
        return g;
    };
    g.toString = function () { return s; };
    return g;
}

console.log(f()());                // foo
console.log(f('it'));              // fit
console.log(f()('x'));             // fox
console.log(f()()('b')('a')('r')); // foobar