Javascript 记忆上次函数结果的最佳/有效方法

Javascript 记忆上次函数结果的最佳/有效方法,javascript,bind,Javascript,Bind,我习惯于使用bind来记住函数的最后一个结果,并跟踪以能够将最后一个结果用于下一个结果。例如,在不使用外部变量的情况下连接最后一个字符串或将最后一个字符串连接到新字符串: function remStr(outStr){ return function c(lastStr,newStr){ if(!newStr)return lastStr; var all = lastStr+newStr; return c.bind(null,all); }.bin

我习惯于使用
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(); // stackoverflow

问题是我想多次调用
remStr
,因此
bind
起了作用。但是它能做得更好吗,或者只是有所不同,也许在某种情况下,一种方法比
remStr
更好地完成任务?

你根本不应该在这里使用
函数。bind
。您可以缓存参数。然后加入它

这种方法众所周知,因为函数也是对象,可以具有属性<代码>函数。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()); // "stackoverflow"

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

函数remStr(outtr){
返回函数c(newStr){
如果(!newStr)返回outtr;
outsr+=newStr;
返回c;
}
}
var str=remStr(“堆栈”);
str=str(‘超过’);
str=str(‘流’);

str();//stackoverflow
如何调用该函数?显示你完全误解了
bind()
。阅读文档。您不能使用会话变量吗?@Sizons在他的情况下,我不想使用。要解释它需要一些时间;)@SLaks你是对的,我对对象使用了这种方法,而不是字符串,所以这就是为什么我使用bind,但是bind首先应该只用于上下文问题。正如第二个答案中提到的,当然可以结束,为什么我没有看到呢。谢谢:)@Blauharley仅供参考JavaScript字符串是不可变的。继续使用
+=
附加到它们是一种相对低效的操作。这种方法将受益于
outtr=[outtr | |“”]
outtr.push(newStr)
返回outtr.join(“”)@Tomalak很好。我已经为缓冲区添加了一些使用as数组的替代代码。@Tomalak非常有趣。@Tomalak这两个问题都已得到纠正。谢谢你指出。