Существует много объяснений о том, как преобразовать функцию arguments
в реальный массив.Понимание методов заимствования javascript
Но я нашел это очень интересным, когда вы упрощаете код с помощью bind
.
MDN Array.prototype.slice - Array-like objects
MDN Function.prototype.bind - Creating shortcuts
Например:
function list() {
return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
Упрощенный вызов:
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);
function list() {
return slice(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
Он работает так же, если вы используете apply
вместо call
:
var slice = Function.prototype.apply.bind(unboundSlice);
Что можно даже сократить, используя call
из любого экземпляра функции, так как одно и то же, как тот, в прототипе и тот же подход с slice
из экземпляра массива:
var slice = alert.call.bind([].slice);
Вы можете попробовать
var slice = alert.call.bind([].slice);
function list() {
console.log(slice(arguments));
}
list(1, 2, 3, 4);
Итак, первая очень странная вещь приходит мне в голову, вызывает bind
на apply
, но первым аргументом bind
должен быть объект (как контекст), а не функция (Array.prototype.slice
).
Другое, что работает с call
и apply
таким же образом.
Я пишу javascript довольно долгое время и используя эти методы каждый день уверенно, но я не могу обернуть вокруг себя эту голову.
Возможно, у меня отсутствуют некоторые очень фундаментальные детали.
Может ли кто-нибудь дать объяснение?
Функции являются объектами. – Pointy
@Pointy, спасибо, я не видел этого с этого угла. – cstuncsik
* «Другое - это то, что работает с обоими вызовами и применяет то же самое». * - Потому что как 'call()', так и 'apply()' ожидать то же самое, что и их первый аргумент, и в ваших примерах вы не передадите никаких дополнительных аргументов. – nnnnnn