У меня есть довольно интересный вопрос о внедрении 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» имеет больше смысла...
Что вы думаете об этом?
-121--770243-
Возможно ли переименование TFS2010 командного проекта?
Данный проект основан на шаблоне командного проекта CMMI 5.0, но он был изменен с несколькими пользовательскими изменениями (новые WIT и типы ссылок).
Чтобы переименование было возможным, необходимо сохранить всю историю.