Best/efficent 记住最后一个函数结果的方法

Best/efficent way to remember last function result

我习惯了使用 bind 来记住函数的上一个结果并保持跟踪以便能够将上一个结果用于下一个结果。例如,在不使用外部变量的情况下将最后一个字符串连接或连接到一个新字符串:

function remStr(outStr){

  return function c(lastStr,newStr){

    if(!newStr)return lastStr;

    var all = lastStr+newStr;

    return c.bind(null,all);

  }.bind(null,outStr);

}

var str = remStr('stack');
str = str('over');
str = str('flow');
str(); // Whosebug

问题是我想多次调用 remStr,所以 bind 发挥了作用。但是它可以做得更好还是不同,也许事实证明,对于一种情况,一种方法比 remStr 更好地完成任务?

你根本不应该在这里使用 Function.bind。您可以缓存参数。那就加入吧。

这种方法广为人知,因为函数也是对象并且可以具有属性。 Function.bind 用于更改给定函数的上下文,这不是我们想要的。

function concat(word){
   return function fn(anWord){
       if(!anWord) return fn.words.join("");
       (fn.words || (fn.words = [word])).push(anWord);
   }
}

现在您可以像下面这样使用它了:

var str = concat("stack");
str("over");
str("flow");
console.log(str()); // "Whosebug"

如果我理解你的意图是正确的,那么只使用闭包怎么样?

function remStr(outStr) {
  return function c(newStr) {
    if (!newStr) return outStr;
    outStr += newStr;
    return c;
  }
}

var str = remStr('stack');
str = str('over');
str = str('flow');
str(); // Whosebug

正如 Tomalak 在评论中提到的,JavaScript 字符串是不可变的,因此如果您打算使用大字符串或许多字符串,您可能希望将它们缓冲在数组中。

function remStr(outStr) {
  var buffer = [outStr || ''];
  return function c(newStr) {
    if (!newStr) return buffer.join('');
    buffer.push(newStr);
    return c;
  }
}

var str = remStr('stack');
str = str('over');
str = str('flow');
str(); // Whosebug