Прототип "Bind" метод выпуска - PullRequest
1 голос
/ 06 декабря 2009
Function.prototype.bind = function(){
    var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
    return function(){
        return fn.apply(object,
            **args.concat(Array.prototype.slice.call(arguments))**);
    };
};

Эта функция в прототипе. Это равно:

Function.prototype.bind = function(){
    var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
    return function(){
        return fn.apply(object,**args**);
    };
};

На мой взгляд, args.concat(Array.prototype.slice.call(arguments)) == args, так как аноним Функция не имеет аргументов. В чем дело?

Ответы [ 2 ]

4 голосов
/ 06 декабря 2009

Нет, они не одинаковы.

Цель объединения аргументов состоит в том, чтобы обеспечить способ частичного применения (или карри ) функции, предварительно заполнение аргументов при использовании bind и возможность добавить больше позже, когда используется функция, которую возвращает bind, например:

var obj = {
  fx: function() {
    alert(Array.prototype.join.call(arguments, ', '));
  }
};

var fx2 = obj.fx.bind(obj, 1, 2, 3);
fx2(4, 5); // Alerts "1, 2, 3, 4, 5"

Как вы можете видеть в последних двух строках кода, когда я объявляю fx2, я передаю obj в качестве первого аргумента (это обеспечит контекст, используемый как переменная object в bind реализация), тогда я передаю значения 1, 2 и 3.

Эти значения хранятся в переменной args внешнего замыкания bind, затем, как вы видите в реализации bind, возвращается другая функция.

Эта функция, возвращаемая в моем примере, является fx2 после присваивания, в последней строке, которую вы видите, я вызываю эту функцию, передавая два дополнительных аргумента.

Наконец, возвращенная функция будет вызывать obj.fx с двумя списками аргументов, аргументами, которые мы предварительно заполняли при вызове bind (1, 2, 3) и аргументами, когда функция фактически выполнялась (4 5).

Вот почему имеет смысл объединить два объекта аргумента.

1 голос
/ 06 декабря 2009

анонимная функция не имеет аргументов

Анонимная функция может действительно иметь аргументы (как и сам метод bind, который также не объявляет никаких аргументов).

Проверка типов в JavaScript отсутствует: вы можете передать в функцию меньше аргументов, чем объявлено в сигнатуре function(...) (в этом случае аргументы, которые не были переданы, получают как undefined), и вы можете передать больше, чем объявлено, и в этом случае единственный способ прочитать их - это массив arguments, который всегда содержит точно, сколько аргументов было передано, независимо от того, что находится в сигнатуре функции.

Обычно считается вежливым помещать комментарий в подпись (function(x, /* y, ... */)), чтобы указать, что с помощью массива arguments будет прочитано больше аргументов.

...