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 с собственной реализацией "привязки" ведет себя абсолютно так же?

Чтобы сделать это Более ясно, что, на мой взгляд, имело бы больше смысла, вот фрагмент кода, который реализует 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" имеет больше смысла ...

Так что вы, ребята, думаете по этому поводу?

22
задан KooiInc 2 September 2011 в 10:45
поделиться