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 bind
e é 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!