Mam dość interesujące pytanie dotyczące implementacji EcmaScript-5 Function.prototype.bind. Zazwyczaj podczas korzystania wiążą, robisz to w ten sposób:Function.prototype.bind
var myFunction = function() {
alert(this);
}.bind(123);
// will alert 123
myFunction();
Dobrze więc, że to fajne, ale to, co jest rzekomo zdarzyć, kiedy to zrobić?
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... 123!
myFunction();
Rozumiem, że jest to całkowicie logiczne zachowanie pod względem jak Function.prototype.bind jest realizowany (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind). Ale czy w rzeczywistych warunkach jest to całkowicie bezużyteczne zachowanie, prawda? Pytanie brzmi: czy to błąd czy funkcja? Jeśli to błąd, dlaczego nigdzie go nie wspomniano? Jeśli jest to funkcja, dlaczego Google Chrome z natywną implementacją "bind" zachowuje się w taki sam sposób?
Żeby było jasne, co moim zdaniem byłoby bardziej sensowne, oto fragment kodu, który implementuje Function.prototype.bind trochę inaczej:
if (!Function.prototype.bind) {
Function.prototype.bind = function() {
var funcObj = this;
var original = funcObj;
var extraArgs = Array.prototype.slice.call(arguments);
var thisObj = extraArgs.shift();
var func = function() {
var thatObj = thisObj;
return original.apply(thatObj, extraArgs.concat(
Array.prototype.slice.call(
arguments, extraArgs.length
)
));
};
func.bind = function() {
var args = Array.prototype.slice.call(arguments);
return Function.prototype.bind.apply(funcObj, args);
}
return func;
};
}
Więc teraz spróbuj to:
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... "foobar"
myFunction();
moim zdaniem, zastępując „to” ma większy sens ...
Co myślicie o tym?
To jest funkcja. Gdybyś mógł to zmienić, nie byłby naprawdę "związany", prawda? Szczegóły można znaleźć w specyfikacji: http://ecma262-5.com/ELS5_HTML.htm#Section_15.3.4.5 –
Oczywiście, ale jeśli tak, to jaki jest sposób ustalenia, czy funkcja została już powiązana coś? lub dlaczego nie rzuca żadnego wyjątku podczas próby ponownego powiązania? Chodzi o to, że bardzo trudno jest debugować, jeśli nie wiesz, czy funkcja została powiązana, czy zajmujesz się jej pierwszą kopią. Taka rzecz przytrafiła mi się wczoraj i spędziłem prawie dzień, aby dowiedzieć się, na czym polega problem ... – Ruslan
W każdym razie wygląda na to, że nikt nie odpowie na to pytanie, więc na wypadek, gdyby ktoś inny miał ten sam problem, stworzyłem pasek narzędziowy, który można znaleźć tutaj: http://www.angrycoding.com/2011/09/to-bind-or-not-to-bind-that-is-in.html – Ruslan