ТЛ; др:
var slice = Function.prototype.call.bind(unboundSlice);
короткий способ написания:
var slice = function(value, start, end) {
return unboundSlice.call(value, start, end);
};
Давайте подумаем об этой линии на второй:
Array.prototype.slice.call(arguments)
.slice
является метод массива для извлечения подмножества массива. Он работает от значения this
. .call
- это метод, который имеет каждая функция, он позволяет установить значение this
для выполнения функции. Таким образом, приведенная выше строка позволяет нам выполнить slice
в качестве метода от arguments
без необходимости мутировать arguments
. Мы могли бы сделать
arguments.slice = Array.prototype.slice;
arguments.slice();
но это не так чист.
Теперь, глядя на
Function.prototype.call.bind(unboundSlice);
Как сказал .call
это метод, который каждый функция имеет. Он также работает на this
, который, как ожидается, будет функцией. Он вызывает и устанавливает значение this
этой функции для первого аргумента. Вы могли бы думать о call
как аналогичные
function call(thisValue, arg1, arg2, ...) {
return this.apply(thisValue, [arg1, arg2, ...]);
}
Обратите внимание, как она называет this
как функция.
.bind
- также способ каждая функция есть. Она возвращает новую функцию, которая имеет свое значение this
прикрепленного к первому аргументу вы передаете в
Давайте рассмотрим, что результирующая функция call.bind(unboundSlice)
будет выглядеть:.
function boundCall(thisValue, arg1, arg2, ...) {
return unboundSlice.apply(thisValue, [arg1, arg2, ...]);
}
Мы просто заменили this
с unboundSlice
. boundCall
теперь будет всегда звонить unboundSlice
.
за то, что он стоит, вы также можете сделать 'var slice = Array.prototype.slice.call.bind (Array.prototype.slice);' хотя точка вашего примера заключается в том, что 'call' необязательно имеет сначала принадлежать функции «slice», и она не привязана к * любой * функции, пока вы не «привяжете» ее. –
Точно так же, как метод 'toString' объекта происходит из' Object.prototype.toString', метод 'call' работает от' Function.prototype.call'. –