У меня довольно интересный вопрос о реализации функции 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 с собственной реализацией "bind" ведет себя абсолютно одинаково?
Чтобы сделать это более понятным, что, на мой взгляд, будет иметь больше смысла, вот фрагмент кода, который реализует 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();
По-моему, замена "this" имеет смысл...
Так что вы, ребята, думаете об этом?