2014-10-07 3 views
2

Моя цель - перебирать список функций и вызывать каждую функцию по очереди. Я хотел бы избежать анонимную функцию, но я с трудом выяснить, где я неправильно (с помощью подчеркивания, но принцип должен быть очень похожи, независимо)вызов 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))) 
+2

Вы передаете '.apply', который не имеет отношения к' .call', если вы на самом деле не вызываете его, а не передаете его. Поэтому вам понадобится '.bind()' для защиты этих отношений ... '_.each ([wait, more], Function.apply.bind (Function.call))', но это неверно, поскольку вы повторяете массив, не передавая его. Поэтому вам понадобится '_.each ([wait, more], Function.call.bind (Function.call))', и это сработает. –

+0

это описание был блестящий. Я прохожу мимо. Я прав, понимая, что через привязку каждый из них действительно будет вызывать Function.call (аргументы) для каждого элемента? – Ben

+0

Да, но где '.call' имеет связанный' this', поэтому он эффективно выполняет 'Function.call.call (аргументы [0], arguments [1], arguments [2])', где аргументы ' item, i, array'. Итак, 'Function.call.call (item, i, array)' точно так же, как 'item.call (i, array)', поэтому, если вы зарегистрируете 'this' и первый аргумент в своих функциях, это должно быть то, что вы получить. –

ответ

1

Вы можете попробовать это:

_.each([wait, more], function(f){ f(); }); 

или даже это:

_.each([wait, more], function(f){ f.call(); }); 

Update: Тогда попробуйте следующее:

_.each([wait, more], Function.prototype.call, Function.prototype.call) 

Bind контекст, используя третий аргумент, like this. Проверьте the doc.

+0

Моя цель - избежать анонимных функций. На более глубоком уровне я хочу понять, почему Function.prototype.call.apply не работает как обратный вызов _.each – Ben

+0

Добро пожаловать :-) –

Смежные вопросы