2015-05-31 4 views
3

Я привык использовать bind для запоминания последнего результата функции и отслеживания, чтобы иметь возможность использовать последний результат для следующего результата. Например, чтобы Concat или присоединиться к последней строки на новую строку без использования внешних переменных:Лучший/эффективный способ запоминания последнего результата функции

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

Как вы хотите, чтобы вызвать функцию? Показать это –

+3

Вы _completely_ недоразумение 'bind()'. Прочтите документацию. – SLaks

+0

Можете ли вы использовать переменную сеанса? – Sizons

ответ

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

+0

Конечно, закрытие возможно, почему я его не видел. спасибо :) – Blauharley

+2

@Blauharley FYI Строки JavaScript неизменяемы. Сохранение добавления к ним с помощью '+ =' является сравнительно неэффективной операцией. Этот подход выиграет от 'outStr = [outStr || ""] ',' outStr.push (newStr) 'и' return outStr.join (""); ' – Tomalak

+1

@Tomalak Хорошая точка. Я добавил некоторый альтернативный код, используя массив для буфера. –

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" 
+0

спасибо за ваш ответ. – Blauharley

+0

добро пожаловать :) @Blauharley –

+1

@Tomalak оба вопроса были исправлены. Спасибо за указание. –

Смежные вопросы