У меня довольно интересный вопрос по EcmaScript-5 Реализация Function.prototype.bind. Обычно, когда вы используете bind, вы делаете это следующим образом:
var myFunction = function() {
alert(this);
}.bind(123);
// will alert 123
myFunction();
Хорошо, это круто, но что должно произойти, когда мы это сделаем?
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... 123!
myFunction();
Я понимаю, что это вполне логичное поведение с точки зрения о том, как реализован Function.prototype.bind ( https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind ). Но в реальных условиях это совершенно бесполезное поведение, не так ли? Вопрос: это ошибка или функция? Если это ошибка, почему она нигде не упоминается? Если это функция, почему тогда Google Chrome с собственной реализацией "привязки" ведет себя абсолютно так же?
Чтобы сделать это Более ясно, что, на мой взгляд, имело бы больше смысла, вот фрагмент кода, который реализует Function.prototype.bind немного иначе:
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;
};
}
Итак, теперь попробуйте следующее:
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... "foobar"
myFunction();
В моем op inion, замена "this" имеет больше смысла ...
Так что вы, ребята, думаете по этому поводу?