Muitas vezes, presumimos que as APIs “nativas” do navegador são rápidas, pelo menos mais rápidas do que os shims que criamos ou usamos. Recentemente, fiquei surpreso com a ler este tópico do StackOverflow que afirma que Function.prototype.bind é muito mais lento do que o que o senhor pode usar como shim. O tópico cita os links do JS Perf (que, infelizmente, não funcionam no momento), mas, supondo que as afirmações sobre velocidade estejam corretas, vamos verificar como podemos criar o nosso próprio bind função.
JavaScript bind Function
Criando um site básico bind é incrivelmente fácil, como o senhor pode ver no exemplo acima:
function bind (fn, ctx) {
return function bound () {
return fn.apply(ctx, arguments);
};
}
// Usage:
bind(this.someFunction, this);
Este é o mais simples possível bind mas não acomoda os argumentos adicionais que o senhor pode fornecer ao binde é por isso que uma função mais completa é mais complicada:
function bind (fn, ctx/* , arg1, arg2 */) {
return (function (prependedArgs) {
return function bound () {
// Concat the bound function arguments with those passed to original bind
var args = prependedArgs.concat(Array.prototype.slice.call(arguments, 0));
return fn.apply(ctx, args);
};
})(Array.prototype.slice.call(arguments, 2));
// Usage
// anotherArg is first arg to onClick, then the event
bind(this.onClick, this, anotherArg);
Esse método mais completo mescla os argumentos passados com os argumentos fornecidos para a chamada de função individual (um Event, por exemplo, se o bind fosse usado em um click ).
Não posso dizer ao senhor com certeza que o Function.prototype.bind é de fato muito lento e, se for o caso, isso ocorre em todos os navegadores. No entanto, é interessante explorar essas velocidades de API nativas em um esforço para tornar nossos aplicativos o mais rápido possível.
O senhor sabe mais sobre bind speed? Por favor, compartilhe!