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!