Моя цель - перебирать список функций и вызывать каждую функцию по очереди. Я хотел бы избежать анонимную функцию, но я с трудом выяснить, где я неправильно (с помощью подчеркивания, но принцип должен быть очень похожи, независимо)вызов Function.prototype.call.apply внутри цикла
function wait() {
console.log("wait")
}
function more() {
console.log("more")
}
_.each([wait, more], Function.prototype.call.apply)
К сожалению, это ошибки.
Uncaught TypeError: Function.prototype.apply was called on undefined, which is a undefined and not a function
Я считаю, что это связано с тем, что итератор функ вызывается с тремя аргументами (пункт, индекс, массив) и Function.prototype.call.apply требует нуль в качестве второго аргумента в этом случае не индекс.
Когда я пытаюсь это, он терпит неудачу с новой ошибкой
_.each([wait, more], _.partial(Function.prototype.call.apply, _, null))
Uncaught TypeError: Function.prototype.apply was called on [object Window], which is a object and not a function
Наконец, это работает
unary = function(func) {
return function(a) {
return func.apply(a);
};
};
_.each([wait, more], unary(_.partial(Function.prototype.call)))
Вы передаете '.apply', который не имеет отношения к' .call', если вы на самом деле не вызываете его, а не передаете его. Поэтому вам понадобится '.bind()' для защиты этих отношений ... '_.each ([wait, more], Function.apply.bind (Function.call))', но это неверно, поскольку вы повторяете массив, не передавая его. Поэтому вам понадобится '_.each ([wait, more], Function.call.bind (Function.call))', и это сработает. –
это описание был блестящий. Я прохожу мимо. Я прав, понимая, что через привязку каждый из них действительно будет вызывать Function.call (аргументы) для каждого элемента? – Ben
Да, но где '.call' имеет связанный' this', поэтому он эффективно выполняет 'Function.call.call (аргументы [0], arguments [1], arguments [2])', где аргументы ' item, i, array'. Итак, 'Function.call.call (item, i, array)' точно так же, как 'item.call (i, array)', поэтому, если вы зарегистрируете 'this' и первый аргумент в своих функциях, это должно быть то, что вы получить. –