记住最后一个功能结果的最佳/有效方法

时间:2015-05-31 16:21:51

标签: javascript bind

我习惯使用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更能完成任务?

2 个答案:

答案 0 :(得分:4)

你根本不应该在这里使用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()); // "stackoverflow"

答案 1 :(得分:4)

如果我理解你的意图,那么只使用闭包呢?

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(); // stackoverflow

正如评论中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(); // stackoverflow