Function.prototype.bind

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

Возможно ли переименование TFS2010 командного проекта?

Данный проект основан на шаблоне командного проекта CMMI 5.0, но он был изменен с несколькими пользовательскими изменениями (новые WIT и типы ссылок).

Чтобы переименование было возможным, необходимо сохранить всю историю.

31
задан havardhu 2 September 2011 в 11:06
поделиться