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