funkce vazby

Často předpokládáme, že „nativní“ rozhraní API v prohlížeči jsou rychlá – přinejmenším rychlejší než shim, které vytváříme nebo používáme. Překvapilo mě, že jsem si nedávno přečetl toto vlákno StackOverflow, které tvrdí, že Function.prototype.bind je mnohem pomalejší než to, co můžete podstrčit. Vlákno cituje odkazy JS Perf (které bohužel momentálně nefungují), ale za předpokladu, že tvrzení o rychlosti jsou správná, pojďme se podívat, jak můžeme vytvořit vlastní bind funkce.

Funkce vazby JavaScript

Vytvoření základního bind funkce je neuvěřitelně snadná, jak již bylo uvedeno výše:

function bind (fn, ctx) {
    return function bound () {
        return fn.apply(ctx, arguments);
    };
}

// Usage:
bind(this.someFunction, this);

Toto je nejjednodušší možný bind funkce, ale nepřizpůsobuje se dalším argumentům, které můžete poskytnout bind , a proto je úplnější funkce složitější:

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);

Tato úplnější metoda sloučí předané argumenty s argumenty poskytnutými jednotlivým voláním funkce (Event , například pokud bind byl použit na click událost).

Nemohu vám s jistotou říci, že Function.prototype.bind je ve skutečnosti velmi pomalý, a pokud ano, je ve všech prohlížečích. Je však zajímavé prozkoumat tyto rychlosti nativního rozhraní API ve snaze, aby naše aplikace byly co nejrychlejší.

Víte více o rychlosti vazby? Prosím sdílejte!