Da bind
kein Cross-Browser ist (alte) Funktion gibt es eine polyfill dafür: (von John Resig Buch)Javascript Bind Implementierung?
/*1*/ Function.prototype.bind = function()
/*2*/ {
/*3*/ var fn = this,
/*4*/ args = Array.prototype.slice.call(arguments),
/*5*/ object = args.shift();
/*6*/ return function()
/*7*/ {
/*8*/ return fn.apply(object,
/*9*/ args.concat(Array.prototype.slice.call(arguments)));
/*10*/ };
/*11*/ };
Aber ich verstehe nicht, warum wir arguments
brauchen in Zeile #9
.
ich meine:
Wenn ich dieses Objekt:
var foo = {
x: 3
}
Und ich habe diese Funktion:
var bar = function(p,b){
console.log(this.x+' '+p+' '+b);
}
Also, wenn ich bar
will im foo
Kontext laufen, mit Parametern - Alles, was ich tun muss, ist:
var boundFunc = bar.bind(foo,1,2)
boundFunc()...
Also wenn ich rufe var.bind(foo,1,2)
die arguments
ist [object Object],1,2
.
Diese Argumente werden in Zeile 4 gespeichert.
Großartig.
Nun wird die bind
Funktion liefert seine eigene closured Funktion:
function()
{
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
}
Frage
Warum wir arguments
hier brauchen? es scheint, dass sie für etwas wie sind:
var boundFunc = bar.bind(foo,1,2)
boundFunc (more1,more2....) //<----- ??
Fehle ich etwas?
Oonce ich setze die erste var boundFunc = bar.bind(foo,1,2)
, ich habe bereits die Parameter deklariert. Warum brauchen wir sie zweimal?
Ich denke, ein Beispiel wird nur die klare Antwort hinzufügen =) – Prusse
gut gemacht. . . . . . ... –