Č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!