代码之家  ›  专栏  ›  技术社区  ›  Code Maniac

如何向函数添加追加参数[重复]

  •  -1
  • Code Maniac  · 技术社区  · 6 年前

    我有以下情况,我有一个功能 f 会引起争论 input .

    我想能够拥有 f 使其满足以下输出:

    f('l') --> fl

    f() --> fo

    f()('l') --> fol

    f()()('l') --> fool

    f()()()('l') --> foool

    我想这是可以实现的:

    function f(input) {
      let str = 'f'
      if (input) {
        return `${str}${input}`
      }
      str = `${str}o`
      return f()
    }
    

    然而,这最终是一个无限循环。我也试过 f 返回一个函数,但这也不起作用。

    我怎么能写 f 为了在保持函数无状态的同时获得我想要的输出?

    0 回复  |  直到 7 年前
        1
  •  1
  •   Thomas    7 年前

    在js中,您甚至可以实现函数的这种双重性,也就是“作为”字符串。但这在生产代码中是不应该使用的。

    const f = function _f(prefix){
      const toString = () => prefix;
      return Object.assign(function(suffix="o"){ 
        return _f(prefix + suffix);
      }, {
        valueOf: toString,
        toString
      });
    }("f");
    
    console.log(""+f('l'))
    console.log(""+f())
    console.log(""+f()('l'))
    console.log(""+f()()('l'))
    console.log(""+f()()()('l'))
    
    let foo = f()();
    let fool = foo("l");
    console.log(""+foo("l"));
    console.log(""+fool);
    console.log(""+foo("bar"));
    console.log(""+fool("bar"));
        2
  •  0
  •   Bharath    7 年前

    试试这个

    function f(input) {
      let str = 'f'
      var o = function(suffix){
        if(suffix)
          return str + suffix;
        str += "o";
        return o;
      }
      return o(input);
    }
    
    console.log(f('l'))
    console.log(f()('l'))
    console.log(f()()('l'))
    console.log(f()()()('l'))
        3
  •  0
  •   fafl    7 年前

    f() 无法返回 fo ,它必须返回一个函数。得到 法罗群岛 你得打个电话 f()('') .

    试试这个:

    function f(input, acc) {
        acc = acc || 'f'
        if (input === undefined) {
            return function(a) {
                return f(a, acc + 'o')
            }
        }
        return acc + input
    }
    
    console.log(f('l'))
    console.log(f()(''))
    console.log(f()('l'))
    console.log(f()()('foo'))
        4
  •  0
  •   T.J. Crowder    6 年前
    f() --> fo
    

    这是不可能的,如果 f() 的返回值也可以作为函数调用。我想你一定是记错了你从哪里得到这个的细节(因为其他的如果熟悉的话,不是这个问题独有的)。类似地,其他一些例子的 o 这是如何正常形成的。

    我怎么能写 f 为了在保持函数无状态的同时获得我想要的输出?

    我不认为你可以,但是你可以这样做,任何涉及的特定功能都没有 改变 状态:

    function f(prefix, letter) {
      if (prefix && letter) {
        return prefix + letter;
      }
      prefix = prefix ? prefix + "o" : "f";
      return function(letter) {
        return f(prefix, letter);
      };
    }
    
    console.log(f()("l"));     // "fl"
    console.log(f()()("l"));   // "fol"
    console.log(f()()()("d")); // "food"

    在那, f 是无状态的,并且 f 返回closeover(当它返回函数时)从不更改。

        5
  •  -1
  •   MathKimRobin    7 年前

    正如我在评论中建议的那样,您最好在每次调用后使用生成器获取每个值。

    function * f(input) {
        for(const character of input) {
            yield character;
        }
    }
    test = f('hello world');
    test.next(); // {value: "h", done: false}
    test.next(); // {value: "e", done: false}
    test.next(); // {value: "l", done: false}
    test.next(); // {value: "l", done: false}
    test.next(); // {value: "o", done: false}
    test.next(); // {value: " ", done: false}
    test.next(); // {value: "w", done: false}
    test.next(); // {value: "o", done: false}
    test.next(); // {value: "r", done: false}
    test.next(); // {value: "l", done: false}
    test.next(); // {value: "d", done: false}
    test.next(); // {value: undefined, done: true}
    

    因此,您只需在每次需要时调用下一个函数并每次连接result.value即可。

    以下是有关生成器的更多文档: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function